From 2cecb456bb5074f4969d0cd362fc27c2e2c5b222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Sun, 1 Jun 2025 23:39:45 +0900 Subject: [PATCH] Return statement --- src/Parser.cpp | 24 ++++++++++++++++++++++++ src/Parser.h | 1 + src/Statement.cpp | 7 +++++++ src/Statement.h | 1 + 4 files changed, 33 insertions(+) diff --git a/src/Parser.cpp b/src/Parser.cpp index 9cb91a4..aba3907 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -29,6 +29,12 @@ shared_ptr Parser::nextStatement() { return statement; } + { + shared_ptr statement = matchReturnStatement(); + if (statement->isValid()) + return statement; + } + { shared_ptr statement = matchExpressionStatement(); if (statement->isValid()) @@ -78,6 +84,24 @@ shared_ptr Parser::matchBlockStatement() { return make_shared(Statement::Kind::BLOCK, nullptr, nullptr, nullptr, statements, ""); } +shared_ptr Parser::matchReturnStatement() { + if (tokens.at(currentIndex).getKind() != Token::Kind::RETURN) + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); + + currentIndex++; + + shared_ptr expression = term(); + if (!expression->isValid()) + expression = nullptr; + + if (tokens.at(currentIndex).getKind() != Token::Kind::NEW_LINE) + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); + + currentIndex++; // new line + + return make_shared(Statement::Kind::RETURN, nullptr, expression, nullptr, vector>(), ""); +} + shared_ptr Parser::matchInvalidStatement() { return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); } diff --git a/src/Parser.h b/src/Parser.h index 5ad626a..fe39db2 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -17,6 +17,7 @@ private: shared_ptr matchFunctionDeclarationStatement(); shared_ptr matchBlockStatement(); + shared_ptr matchReturnStatement(); shared_ptr matchInvalidStatement(); shared_ptr matchExpressionStatement(); diff --git a/src/Statement.cpp b/src/Statement.cpp index d54d652..2049e75 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -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"; } diff --git a/src/Statement.h b/src/Statement.h index 070719f..362521c 100644 --- a/src/Statement.h +++ b/src/Statement.h @@ -14,6 +14,7 @@ public: EXPRESSION, BLOCK, FUNCTION_DECLARATION, + RETURN, INVALID };