Return statement

This commit is contained in:
Rafał Grodziński
2025-06-01 23:39:45 +09:00
parent fcfe6392a4
commit 2cecb456bb
4 changed files with 33 additions and 0 deletions

View File

@@ -29,6 +29,12 @@ shared_ptr<Statement> Parser::nextStatement() {
return statement;
}
{
shared_ptr<Statement> statement = matchReturnStatement();
if (statement->isValid())
return statement;
}
{
shared_ptr<Statement> statement = matchExpressionStatement();
if (statement->isValid())
@@ -78,6 +84,24 @@ shared_ptr<Statement> Parser::matchBlockStatement() {
return make_shared<Statement>(Statement::Kind::BLOCK, nullptr, nullptr, nullptr, statements, "");
}
shared_ptr<Statement> Parser::matchReturnStatement() {
if (tokens.at(currentIndex).getKind() != Token::Kind::RETURN)
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
currentIndex++;
shared_ptr<Expression> expression = term();
if (!expression->isValid())
expression = nullptr;
if (tokens.at(currentIndex).getKind() != Token::Kind::NEW_LINE)
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
currentIndex++; // new line
return make_shared<Statement>(Statement::Kind::RETURN, nullptr, expression, nullptr, vector<shared_ptr<Statement>>(), "");
}
shared_ptr<Statement> Parser::matchInvalidStatement() {
return make_shared<Statement>(Statement::Kind::INVALID, make_shared<Token>(tokens.at(currentIndex)), nullptr, nullptr, vector<shared_ptr<Statement>>(), "");
}