From 8dcdcc7061da2c818dfc2043cbb507f49b2f0bd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 7 Aug 2025 18:35:43 +0900 Subject: [PATCH] Correctly parse blob --- src/Parser/Parsee/Parsee.cpp | 1 + src/Parser/Parser.cpp | 78 +++++++++++++----------------------- src/Parser/Parser.h | 8 ++-- 3 files changed, 32 insertions(+), 55 deletions(-) diff --git a/src/Parser/Parsee/Parsee.cpp b/src/Parser/Parsee/Parsee.cpp index b3a5d21..455c736 100644 --- a/src/Parser/Parsee/Parsee.cpp +++ b/src/Parser/Parsee/Parsee.cpp @@ -7,6 +7,7 @@ Parsee Parsee::repeatedGroupParsee(ParseeGroup repeatedGroup, bool isRequired, b parsee.kind = ParseeKind::REPEATED_GROUP; parsee.repeatedGroup = repeatedGroup; parsee.isRequired = isRequired; + parsee.shouldReturn = shouldReturn; parsee.shouldFailOnNoMatch = shouldFailOnNoMatch; return parsee; } diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 6c48ab1..1a9df82 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -510,20 +510,14 @@ shared_ptr Parser::matchStatementBlob() { Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), Parsee::valueTypeParsee(true), Parsee::tokenParsee(TokenKind::NEW_LINE, true, false) - }/*, - {}*/ - ), false, true, false + } + ), + false, + true, + false ), Parsee::tokenParsee(TokenKind::SEMICOLON, true, false) - }/*, - {} - ParseeGroup( - { - Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), - Parsee::valueTypeParsee(true) - }, - {} - )*/ + } ) ); @@ -544,16 +538,16 @@ shared_ptr Parser::matchStatementBlob() { } // consume new line - if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) { + /*if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) { markError(TokenKind::NEW_LINE, {}); return nullptr; - } + }*/ // closing semicolon - if(!tryMatchingTokenKinds({TokenKind::SEMICOLON}, false, true)) { + /*if(!tryMatchingTokenKinds({TokenKind::SEMICOLON}, false, true)) { markError(TokenKind::SEMICOLON, {}); return nullptr; - } + }*/ return make_shared(identifier, variables); } @@ -1045,10 +1039,9 @@ ParseeResultsGroup Parser::parseeResultsGroupForParseeGroup(ParseeGroup group) { bool mustFulfill = false; for (Parsee &parsee : group.getParsees()) { - optional> subResults; + optional, int>> subResults; switch (parsee.getKind()) { case ParseeKind::REPEATED_GROUP: - //ParseeResultsGroup results = parseeResultsGroupForParseeGroup(*parsee.getRepeatedGroup()); subResults = repeatedGroupParseeResults(*parsee.getRepeatedGroup()); break; case ParseeKind::TOKEN: @@ -1069,14 +1062,12 @@ ParseeResultsGroup Parser::parseeResultsGroupForParseeGroup(ParseeGroup group) { // if doesn't match on optional group if (!subResults && parsee.getIsRequired() && !mustFulfill) { currentIndex = startIndex; - //return vector(); return ParseeResultsGroup::noMatch(); } // return matching token? if (subResults && parsee.getShouldReturn()) { - //parseeResults.push_back(*result); - for (ParseeResult &subResult : *subResults) + for (ParseeResult &subResult : (*subResults).first) parseeResults.push_back(subResult); } @@ -1087,34 +1078,18 @@ ParseeResultsGroup Parser::parseeResultsGroupForParseeGroup(ParseeGroup group) { // invalid sequence detected? if (!subResults && parsee.getIsRequired() && mustFulfill) { markError(parsee.getTokenKind(), {}); - //return {}; return ParseeResultsGroup::failure(); } // got to the next token if we got a match - if (subResults) { - for (ParseeResult &subResult : *subResults ) - currentIndex += subResult.getTokensCount(); - //currentIndex += (*result).getTokensCount(); - } + if (subResults) + currentIndex += (*subResults).second; } - /*if (group.getRepeatedGroup()) { - ParseeResultsGroup subResultsGroup; - do { - subResultsGroup = parseeResultsGroupForParseeGroup(*group.getRepeatedGroup()); - if (subResultsGroup.getKind() == ParseeResultsGroupKind::FAILURE) - return ParseeResultsGroup::failure(); - - for (ParseeResult &subResult : subResultsGroup.getResults()) - results.push_back(subResult); - } while (subResultsGroup.getKind() == ParseeResultsGroupKind::SUCCESS); - }*/ - return ParseeResultsGroup::success(parseeResults); } -optional> Parser::repeatedGroupParseeResults(ParseeGroup group) { +optional, int>> Parser::repeatedGroupParseeResults(ParseeGroup group) { int startIndex = currentIndex; vector results; @@ -1128,18 +1103,19 @@ optional> Parser::repeatedGroupParseeResults(ParseeGroup gr results.push_back(result); } while (resultsGroup.getKind() == ParseeResultsGroupKind::SUCCESS); + int tokensCount = currentIndex - startIndex; currentIndex = startIndex; - return results; + return pair(results, tokensCount); } -optional> Parser::tokenParseeResults(int index, TokenKind tokenKind) { +optional, int>> Parser::tokenParseeResults(int index, TokenKind tokenKind) { shared_ptr token = tokens.at(index); if (token->isOfKind({tokenKind})) - return vector({ParseeResult::tokenResult(token)}); + return pair(vector({ParseeResult::tokenResult(token)}), 1); return {}; } -optional> Parser::valueTypeParseeResults(int index) { +optional, int>> Parser::valueTypeParseeResults(int index) { int startIndex = index; if (!tokens.at(index)->isOfKind({TokenKind::TYPE})) @@ -1151,11 +1127,11 @@ optional> Parser::valueTypeParseeResults(int index) { if (tokens.at(index)->isOfKind({TokenKind::LESS})) { index++; - optional> subResults = valueTypeParseeResults(index); - if (!subResults || (*subResults).empty()) + optional, int>> subResults = valueTypeParseeResults(index); + if (!subResults || (*subResults).first.empty()) return {}; - subType = (*subResults)[0].getValueType(); - index += (*subResults)[0].getTokensCount(); + subType = (*subResults).first[0].getValueType(); + index += (*subResults).second; if (tokens.at(index)->isOfKind({TokenKind::COMMA})) { index++; @@ -1177,10 +1153,10 @@ optional> Parser::valueTypeParseeResults(int index) { } shared_ptr valueType = ValueType::valueTypeForToken(typeToken, subType, typeArg); - return vector({ParseeResult::valueTypeResult(valueType, index - startIndex)}); + return pair(vector({ParseeResult::valueTypeResult(valueType, index - startIndex)}), index - startIndex); } -optional> Parser::expressionParseeResults(int index) { +optional, int>> Parser::expressionParseeResults(int index) { int startIndex = currentIndex; int errorsCount = errors.size(); shared_ptr expression = nextExpression(); @@ -1189,7 +1165,7 @@ optional> Parser::expressionParseeResults(int index) { int tokensCount = currentIndex - startIndex; currentIndex = startIndex; - return vector({ParseeResult::expressionResult(expression, tokensCount)}); + return pair(vector({ParseeResult::expressionResult(expression, tokensCount)}), tokensCount); } bool Parser::tryMatchingTokenKinds(vector kinds, bool shouldMatchAll, bool shouldAdvance) { diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 5ef35a6..4d36593 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -57,10 +57,10 @@ private: shared_ptr matchExpressionBlock(vector terminalTokenKinds); ParseeResultsGroup parseeResultsGroupForParseeGroup(ParseeGroup group); - optional> repeatedGroupParseeResults(ParseeGroup group); - optional> tokenParseeResults(int index, TokenKind tokenKind); - optional> valueTypeParseeResults(int index); - optional> expressionParseeResults(int index); + optional, int>> repeatedGroupParseeResults(ParseeGroup group); + optional, int>> tokenParseeResults(int index, TokenKind tokenKind); + optional, int>> valueTypeParseeResults(int index); + optional, int>> expressionParseeResults(int index); bool tryMatchingTokenKinds(vector kinds, bool shouldMatchAll, bool shouldAdvance); void markError(optional expectedTokenKind, optional message);