Added parsee and parsee group
This commit is contained in:
39
src/Parser/Parsee.cpp
Normal file
39
src/Parser/Parsee.cpp
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
#include "Parsee.h"
|
||||||
|
|
||||||
|
#include "Lexer/Token.h"
|
||||||
|
|
||||||
|
ParseeToken::ParseeToken(TokenKind tokenKind, bool isRequired, bool shouldReturn):
|
||||||
|
tokenKind(tokenKind), isRequired(isRequired), shouldReturn(shouldReturn) { }
|
||||||
|
|
||||||
|
TokenKind ParseeToken::getTokenKind() {
|
||||||
|
return tokenKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseeToken::getIsRequired() {
|
||||||
|
return isRequired;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseeToken::getShouldReturn() {
|
||||||
|
return shouldReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
ParseeTokensGroup::ParseeTokensGroup(bool isRequired, vector<ParseeToken> tokens, optional<ParseeTokensGroup> repeatedGroup):
|
||||||
|
isRequired(isRequired), tokens(tokens) {
|
||||||
|
if (repeatedGroup) {
|
||||||
|
this->repeatedGroup = *repeatedGroup;
|
||||||
|
} else {
|
||||||
|
this->repeatedGroup = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParseeTokensGroup::getIsRequired() {
|
||||||
|
return isRequired;
|
||||||
|
}
|
||||||
|
|
||||||
|
vector<ParseeToken> ParseeTokensGroup::getTokens() {
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
|
||||||
|
optional<reference_wrapper<ParseeTokensGroup>> ParseeTokensGroup::getRepeatedGroup() {
|
||||||
|
return repeatedGroup;
|
||||||
|
}
|
||||||
37
src/Parser/Parsee.h
Normal file
37
src/Parser/Parsee.h
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#ifndef PARSEE_H
|
||||||
|
#define PARSEE_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
enum class TokenKind;
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class ParseeToken {
|
||||||
|
private:
|
||||||
|
TokenKind tokenKind;
|
||||||
|
bool isRequired;
|
||||||
|
bool shouldReturn;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ParseeToken(TokenKind tokenKind, bool isRequired, bool shouldReturn);
|
||||||
|
TokenKind getTokenKind();
|
||||||
|
bool getIsRequired();
|
||||||
|
bool getShouldReturn();
|
||||||
|
};
|
||||||
|
|
||||||
|
class ParseeTokensGroup {
|
||||||
|
private:
|
||||||
|
bool isRequired;
|
||||||
|
vector<ParseeToken> tokens;
|
||||||
|
optional<reference_wrapper<ParseeTokensGroup>> repeatedGroup;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ParseeTokensGroup(bool isRequired, vector<ParseeToken> tokens, optional<ParseeTokensGroup> repeatedGroup);
|
||||||
|
bool getIsRequired();
|
||||||
|
vector<ParseeToken> getTokens();
|
||||||
|
optional<reference_wrapper<ParseeTokensGroup>> getRepeatedGroup();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -25,6 +25,8 @@
|
|||||||
#include "Parser/Statement/StatementBlock.h"
|
#include "Parser/Statement/StatementBlock.h"
|
||||||
#include "Parser/Statement/StatementRepeat.h"
|
#include "Parser/Statement/StatementRepeat.h"
|
||||||
|
|
||||||
|
#include "Parsee.h"
|
||||||
|
|
||||||
Parser::Parser(vector<shared_ptr<Token>> tokens) :
|
Parser::Parser(vector<shared_ptr<Token>> tokens) :
|
||||||
tokens(tokens) { }
|
tokens(tokens) { }
|
||||||
|
|
||||||
@@ -236,6 +238,55 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<Statement> Parser::matchStatementRawFunction() {
|
shared_ptr<Statement> Parser::matchStatementRawFunction() {
|
||||||
|
ParseeTokensGroup idGroup = ParseeTokensGroup(
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
ParseeToken(TokenKind::IDENTIFIER, true, true),
|
||||||
|
ParseeToken(TokenKind::RAW_FUNCTION, true, false)
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
ParseeTokensGroup optionsGroup = ParseeTokensGroup(
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
ParseeToken(TokenKind::LESS, true, false),
|
||||||
|
ParseeToken(TokenKind::STRING, true, true),
|
||||||
|
ParseeToken(TokenKind::GREATER, true, false)
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
|
ParseeTokensGroup argumentsGroup = ParseeTokensGroup(
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
ParseeToken(TokenKind::COLON, true, false),
|
||||||
|
ParseeToken(TokenKind::NEW_LINE, false, false),
|
||||||
|
ParseeToken(TokenKind::IDENTIFIER, true, true),
|
||||||
|
ParseeToken(TokenKind::TYPE, true, true)
|
||||||
|
},
|
||||||
|
ParseeTokensGroup(
|
||||||
|
true,
|
||||||
|
{
|
||||||
|
ParseeToken(TokenKind::COMMA, true, false),
|
||||||
|
ParseeToken(TokenKind::NEW_LINE, false, false),
|
||||||
|
ParseeToken(TokenKind::IDENTIFIER, true, true),
|
||||||
|
ParseeToken(TokenKind::TYPE, true, true)
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
ParseeTokensGroup returnGroup = ParseeTokensGroup(
|
||||||
|
false,
|
||||||
|
{
|
||||||
|
ParseeToken(TokenKind::RIGHT_ARROW, true, false),
|
||||||
|
ParseeToken(TokenKind::NEW_LINE, false, false),
|
||||||
|
ParseeToken(TokenKind::TYPE, true, true)
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
|
||||||
if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::RAW_FUNCTION}, true, false))
|
if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::RAW_FUNCTION}, true, false))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ class ValueType;
|
|||||||
class Expression;
|
class Expression;
|
||||||
class Statement;
|
class Statement;
|
||||||
|
|
||||||
|
class ParseeToken;
|
||||||
|
class ParseeTokensGroup;
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
class Parser {
|
class Parser {
|
||||||
|
|||||||
Reference in New Issue
Block a user