From fcfe6392a482fb2c3a15af19518c89093d4fa159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Sun, 1 Jun 2025 23:17:07 +0900 Subject: [PATCH] Function declaration statement --- src/Parser.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 1f66b36..9cb91a4 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -23,6 +23,12 @@ vector> Parser::getStatements() { // Statement // shared_ptr Parser::nextStatement() { + { + shared_ptr statement = matchFunctionDeclarationStatement(); + if (statement->isValid()) + return statement; + } + { shared_ptr statement = matchExpressionStatement(); if (statement->isValid()) @@ -34,7 +40,7 @@ shared_ptr Parser::nextStatement() { shared_ptr Parser::matchFunctionDeclarationStatement() { if (!matchesTokenKinds({Token::Kind::IDENTIFIER, Token::Kind::COLON, Token::Kind::FUNCTION})) - return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, { }, ""); + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); Token identifierToken = tokens.at(currentIndex); currentIndex++; @@ -49,7 +55,7 @@ shared_ptr Parser::matchFunctionDeclarationStatement() { if (!blockStatement->isValid()) return blockStatement; - return make_shared(Statement::Kind::FUNCTION_DECLARATION, nullptr, nullptr, blockStatement, { }, identifierToken.getLexme()); + return make_shared(Statement::Kind::FUNCTION_DECLARATION, nullptr, nullptr, blockStatement, vector>(), identifierToken.getLexme()); } shared_ptr Parser::matchBlockStatement() { @@ -62,11 +68,18 @@ shared_ptr Parser::matchBlockStatement() { statements.push_back(statement); } currentIndex++; // skip ; + + if (!tokens.at(currentIndex).isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); + + if (tokens.at(currentIndex).getKind() == Token::Kind::NEW_LINE) + currentIndex++; + return make_shared(Statement::Kind::BLOCK, nullptr, nullptr, nullptr, statements, ""); } shared_ptr Parser::matchInvalidStatement() { - return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, { }, ""); + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); } // @@ -76,9 +89,9 @@ shared_ptr Parser::matchExpressionStatement() { shared_ptr expression = term(); if (expression->isValid() && tokens.at(currentIndex).isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) { currentIndex++; - return make_shared(Statement::Kind::EXPRESSION, nullptr, expression, nullptr, { }, ""); + return make_shared(Statement::Kind::EXPRESSION, nullptr, expression, nullptr, vector>(), ""); } else { - return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), expression, nullptr, { }, ""); + return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), expression, nullptr, vector>(), ""); } }