From 8579de4fba9707a50f03a49c2e230fdf5035e1d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Fri, 13 Jun 2025 12:29:59 +0900 Subject: [PATCH] Added function return type --- src/Parser.cpp | 48 +++++++++++++++++++++++++++++------------------ src/Statement.cpp | 32 ++++++++++++++++--------------- 2 files changed, 47 insertions(+), 33 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 094300f..119b067 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -53,9 +53,22 @@ shared_ptr Parser::matchStatementFunctionDeclaration() { currentIndex++; // skip colon currentIndex++; // skip fun - // FIXME: implement function arguments - while (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, false)) - currentIndex++; + // Return type + ValueType returnType = ValueType::VOID; + if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) { + shared_ptr valueTypeToken = tokens.at(currentIndex); + + if (valueTypeToken->getLexme().compare("bool") == 0) + returnType = ValueType::BOOL; + else if (valueTypeToken->getLexme().compare("sint32") == 0) + returnType = ValueType::SINT32; + else if (valueTypeToken->getLexme().compare("real32") == 0) + returnType = ValueType::REAL32; + else + return matchStatementInvalid("Expected return type"); + + currentIndex++; // type + } currentIndex++; // new line shared_ptr statementBlock = matchStatementBlock({TokenKind::SEMICOLON}, true); @@ -67,7 +80,7 @@ shared_ptr Parser::matchStatementFunctionDeclaration() { if(!tryMatchingTokenKinds({TokenKind::NEW_LINE}, false, true)) return matchStatementInvalid("Expected a new line after a function declaration"); - return make_shared(identifierToken->getLexme(), ValueType::SINT32, dynamic_pointer_cast(statementBlock)); + return make_shared(identifierToken->getLexme(), returnType, dynamic_pointer_cast(statementBlock)); } shared_ptr Parser::matchStatementVarDeclaration() { @@ -78,28 +91,27 @@ shared_ptr Parser::matchStatementVarDeclaration() { currentIndex++; currentIndex++; // skip colon shared_ptr valueTypeToken = tokens.at(currentIndex); - currentIndex++; // skip fun + + ValueType valueType; + if (valueTypeToken->getLexme().compare("bool") == 0) + valueType = ValueType::BOOL; + else if (valueTypeToken->getLexme().compare("sint32") == 0) + valueType = ValueType::SINT32; + else if (valueTypeToken->getLexme().compare("real32") == 0) + valueType = ValueType::REAL32; + else + return matchStatementInvalid("Invalid type"); + + currentIndex++; // type // Expect left arrow if (!tryMatchingTokenKinds({TokenKind::LEFT_ARROW}, true, true)) - return matchStatementInvalid(); + return matchStatementInvalid("Expected left arrow"); shared_ptr expression = nextExpression(); if (expression == nullptr || !expression->isValid()) return matchStatementInvalid(); - ValueType valueType; - if (valueTypeToken->getLexme().compare("Void") == 0) - valueType = ValueType::VOID; - else if (valueTypeToken->getLexme().compare("Bool") == 0) - valueType = ValueType::BOOL; - else if (valueTypeToken->getLexme().compare("SInt32") == 0) - valueType = ValueType::SINT32; - else if (valueTypeToken->getLexme().compare("Real32") == 0) - valueType = ValueType::REAL32; - else - return matchStatementInvalid(); - // Expect new line if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, false, true)) return matchStatementInvalid("Expected a new line after variable declaration"); diff --git a/src/Statement.cpp b/src/Statement.cpp index 4be7302..35185a1 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -1,5 +1,18 @@ #include "Statement.h" +string valueTypeToString(ValueType valueType) { + switch (valueType) { + case ValueType::VOID: + return "NONE"; + case ValueType::BOOL: + return "BOOL"; + case ValueType::SINT32: + return "SINT32"; + case ValueType::REAL32: + return "REAL32"; + } +} + // // Statement Statement::Statement(StatementKind kind): kind(kind) { @@ -39,7 +52,9 @@ string StatementFunctionDeclaration::toString(int indent) { string value = ""; for (int ind=0; indtoString(indent+1); for (int ind=0; ind