Added parsee and parsee group

This commit is contained in:
Rafał Grodziński
2025-07-15 18:50:15 +09:00
parent 89e81a4a49
commit dc6668459f
4 changed files with 130 additions and 0 deletions

39
src/Parser/Parsee.cpp Normal file
View 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
View 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

View File

@@ -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;

View File

@@ -12,6 +12,9 @@ class ValueType;
class Expression;
class Statement;
class ParseeToken;
class ParseeTokensGroup;
using namespace std;
class Parser {