From dc6668459f0bc42e940b51fa6d1a2eb876ac120a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Tue, 15 Jul 2025 18:50:15 +0900 Subject: [PATCH] Added parsee and parsee group --- src/Parser/Parsee.cpp | 39 +++++++++++++++++++++++++++++++++ src/Parser/Parsee.h | 37 +++++++++++++++++++++++++++++++ src/Parser/Parser.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++ src/Parser/Parser.h | 3 +++ 4 files changed, 130 insertions(+) create mode 100644 src/Parser/Parsee.cpp create mode 100644 src/Parser/Parsee.h diff --git a/src/Parser/Parsee.cpp b/src/Parser/Parsee.cpp new file mode 100644 index 0000000..735be13 --- /dev/null +++ b/src/Parser/Parsee.cpp @@ -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 tokens, optional repeatedGroup): +isRequired(isRequired), tokens(tokens) { + if (repeatedGroup) { + this->repeatedGroup = *repeatedGroup; + } else { + this->repeatedGroup = {}; + } + } + +bool ParseeTokensGroup::getIsRequired() { + return isRequired; +} + +vector ParseeTokensGroup::getTokens() { + return tokens; +} + +optional> ParseeTokensGroup::getRepeatedGroup() { + return repeatedGroup; +} \ No newline at end of file diff --git a/src/Parser/Parsee.h b/src/Parser/Parsee.h new file mode 100644 index 0000000..22c274e --- /dev/null +++ b/src/Parser/Parsee.h @@ -0,0 +1,37 @@ +#ifndef PARSEE_H +#define PARSEE_H + +#include +#include + +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 tokens; + optional> repeatedGroup; + +public: + ParseeTokensGroup(bool isRequired, vector tokens, optional repeatedGroup); + bool getIsRequired(); + vector getTokens(); + optional> getRepeatedGroup(); +}; + +#endif \ No newline at end of file diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 9852fa2..f4f824c 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -25,6 +25,8 @@ #include "Parser/Statement/StatementBlock.h" #include "Parser/Statement/StatementRepeat.h" +#include "Parsee.h" + Parser::Parser(vector> tokens) : tokens(tokens) { } @@ -236,6 +238,55 @@ shared_ptr Parser::matchStatementFunction() { } shared_ptr 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; diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index fdfe4a2..026c609 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -12,6 +12,9 @@ class ValueType; class Expression; class Statement; +class ParseeToken; +class ParseeTokensGroup; + using namespace std; class Parser {