From d3b1d053562fb3e1bcdf4960a3d2685919b5370e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 31 Jul 2025 12:37:49 +0900 Subject: [PATCH] Converted assignment --- src/Parser/Parser.cpp | 98 +++++++++++++++++++++++++++---------------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index d55b31e..a5f3246 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -207,7 +207,6 @@ shared_ptr Parser::matchStatementFunction() { break; case ParseeResultsGroupKind::NO_MATCH: return nullptr; - break; case ParseeResultsGroupKind::FAILURE: hasError = true; break; @@ -465,58 +464,87 @@ shared_ptr Parser::matchStatementBlock(vector terminalToke } shared_ptr Parser::matchStatementAssignment() { - int startIndex = currentIndex; + ParseeResultsGroup resultsGroup; - if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER}, true, false)) - return nullptr; - shared_ptr identifierToken = tokens.at(currentIndex++); + string identifier; shared_ptr indexExpression; + shared_ptr expression; - if (tryMatchingTokenKinds({TokenKind::LEFT_SQUARE_BRACKET}, true, true)) { - indexExpression = nextExpression(); - if (indexExpression == nullptr) - return nullptr; + // identifier + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), + }, + {} + ) + ); - if (!tryMatchingTokenKinds({TokenKind::RIGHT_SQUARE_BRACKET}, true, true)) { - markError(TokenKind::RIGHT_SQUARE_BRACKET, {}); - return nullptr; - } - } - - // assignment requires left arrow, otherwise abort - if (!tryMatchingTokenKinds({TokenKind::LEFT_ARROW}, true, true)) { - currentIndex = startIndex; - return nullptr; - } - - shared_ptr expression = nextExpression(); - if (expression == nullptr) + if (resultsGroup.getKind() != ParseeResultsGroupKind::SUCCESS) return nullptr; - return make_shared(identifierToken->getLexme(), indexExpression, expression); + identifier = resultsGroup.getResults().at(0).getToken()->getLexme(); + + // index expression + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::LEFT_SQUARE_BRACKET, true, false), + Parsee::expressionParsee(true), + Parsee::tokenParsee(TokenKind::RIGHT_SQUARE_BRACKET, true, false), + }, + {} + ) + ); + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + indexExpression = resultsGroup.getResults().at(0).getExpression(); + break; + case ParseeResultsGroupKind::NO_MATCH: + break; + case ParseeResultsGroupKind::FAILURE: + return nullptr; + } + + // expression + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::LEFT_ARROW, true, false), + Parsee::expressionParsee(true) + }, + {} + ) + ); + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + expression = resultsGroup.getResults().at(0).getExpression(); + break; + case ParseeResultsGroupKind::NO_MATCH: + case ParseeResultsGroupKind::FAILURE: + return nullptr; + } + + return make_shared(identifier, indexExpression, expression); } shared_ptr Parser::matchStatementReturn() { - shared_ptr expression; - ParseeResultsGroup resultsGroup = parseeResultsGroupForParseeGroup( ParseeGroup( { Parsee::tokenParsee(TokenKind::RETURN, true, false), Parsee::expressionParsee(false) }, - { } + {} ) ); - switch (resultsGroup.getKind()) { - case ParseeResultsGroupKind::SUCCESS: - expression = !resultsGroup.getResults().empty() ? resultsGroup.getResults().at(0).getExpression() : nullptr; - break; - case ParseeResultsGroupKind::NO_MATCH: - case ParseeResultsGroupKind::FAILURE: - return nullptr; - } + if (resultsGroup.getKind() != ParseeResultsGroupKind::SUCCESS) + return nullptr; + + shared_ptr expression = !resultsGroup.getResults().empty() ? resultsGroup.getResults().at(0).getExpression() : nullptr; return make_shared(expression); }