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>>(), "");
}

View File

@@ -17,6 +17,7 @@ private:
shared_ptr<Statement> matchFunctionDeclarationStatement();
shared_ptr<Statement> matchBlockStatement();
shared_ptr<Statement> matchReturnStatement();
shared_ptr<Statement> matchInvalidStatement();
shared_ptr<Statement> matchExpressionStatement();

View File

@@ -31,6 +31,13 @@ string Statement::toString() {
}
case FUNCTION_DECLARATION:
return "FUNCTION " + name + "\n" + blockStatement->toString() + "\n;";
case RETURN: {
string value = "RETURN";
if (expression != nullptr) {
value += " " + expression->toString();
}
return value;
}
case INVALID:
return "INVALID";
}

View File

@@ -14,6 +14,7 @@ public:
EXPRESSION,
BLOCK,
FUNCTION_DECLARATION,
RETURN,
INVALID
};