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/StatementRepeat.h"
|
||||
|
||||
#include "Parsee.h"
|
||||
|
||||
Parser::Parser(vector<shared_ptr<Token>> tokens) :
|
||||
tokens(tokens) { }
|
||||
|
||||
@@ -236,6 +238,55 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
|
||||
}
|
||||
|
||||
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))
|
||||
return nullptr;
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@ class ValueType;
|
||||
class Expression;
|
||||
class Statement;
|
||||
|
||||
class ParseeToken;
|
||||
class ParseeTokensGroup;
|
||||
|
||||
using namespace std;
|
||||
|
||||
class Parser {
|
||||
|
||||
Reference in New Issue
Block a user