Converted assignment

This commit is contained in:
Rafał Grodziński
2025-07-31 12:37:49 +09:00
parent 163bcb4057
commit d3b1d05356

View File

@@ -207,7 +207,6 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
break; break;
case ParseeResultsGroupKind::NO_MATCH: case ParseeResultsGroupKind::NO_MATCH:
return nullptr; return nullptr;
break;
case ParseeResultsGroupKind::FAILURE: case ParseeResultsGroupKind::FAILURE:
hasError = true; hasError = true;
break; break;
@@ -465,58 +464,87 @@ shared_ptr<Statement> Parser::matchStatementBlock(vector<TokenKind> terminalToke
} }
shared_ptr<Statement> Parser::matchStatementAssignment() { shared_ptr<Statement> Parser::matchStatementAssignment() {
int startIndex = currentIndex; ParseeResultsGroup resultsGroup;
if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER}, true, false)) string identifier;
return nullptr;
shared_ptr<Token> identifierToken = tokens.at(currentIndex++);
shared_ptr<Expression> indexExpression; shared_ptr<Expression> indexExpression;
shared_ptr<Expression> expression;
if (tryMatchingTokenKinds({TokenKind::LEFT_SQUARE_BRACKET}, true, true)) { // identifier
indexExpression = nextExpression(); resultsGroup = parseeResultsGroupForParseeGroup(
if (indexExpression == nullptr) ParseeGroup(
return nullptr; {
Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true),
},
{}
)
);
if (!tryMatchingTokenKinds({TokenKind::RIGHT_SQUARE_BRACKET}, true, true)) { if (resultsGroup.getKind() != ParseeResultsGroupKind::SUCCESS)
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> expression = nextExpression();
if (expression == nullptr)
return nullptr; return nullptr;
return make_shared<StatementAssignment>(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<StatementAssignment>(identifier, indexExpression, expression);
} }
shared_ptr<Statement> Parser::matchStatementReturn() { shared_ptr<Statement> Parser::matchStatementReturn() {
shared_ptr<Expression> expression;
ParseeResultsGroup resultsGroup = parseeResultsGroupForParseeGroup( ParseeResultsGroup resultsGroup = parseeResultsGroupForParseeGroup(
ParseeGroup( ParseeGroup(
{ {
Parsee::tokenParsee(TokenKind::RETURN, true, false), Parsee::tokenParsee(TokenKind::RETURN, true, false),
Parsee::expressionParsee(false) Parsee::expressionParsee(false)
}, },
{ } {}
) )
); );
switch (resultsGroup.getKind()) { if (resultsGroup.getKind() != ParseeResultsGroupKind::SUCCESS)
case ParseeResultsGroupKind::SUCCESS: return nullptr;
expression = !resultsGroup.getResults().empty() ? resultsGroup.getResults().at(0).getExpression() : nullptr;
break; shared_ptr<Expression> expression = !resultsGroup.getResults().empty() ? resultsGroup.getResults().at(0).getExpression() : nullptr;
case ParseeResultsGroupKind::NO_MATCH:
case ParseeResultsGroupKind::FAILURE:
return nullptr;
}
return make_shared<StatementReturn>(expression); return make_shared<StatementReturn>(expression);
} }