From 3e1311513f0de90adf94730c2722bb1ad026ecf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 5 Jun 2025 19:52:54 +0900 Subject: [PATCH] Fixed condition --- src/Parser.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++--- src/Statement.cpp | 1 + 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index fecb75c..b61dc79 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -65,7 +65,7 @@ shared_ptr Parser::matchStatementFunctionDeclaration() { shared_ptr Parser::matchStatementBlock() { vector> statements; - while (tokens.at(currentIndex)->getKind() != Token::Kind::SEMICOLON) { + while (!tokens.at(currentIndex)->isOfKind({Token::Kind::SEMICOLON, Token::Kind::COLON})) { shared_ptr statement = nextStatement(); if (statement == nullptr) return matchStatementInvalid(); @@ -74,7 +74,7 @@ shared_ptr Parser::matchStatementBlock() { else statements.push_back(statement); } - currentIndex++; // skip ; + currentIndex++; // consune ';' and ':' if (!tokens.at(currentIndex)->isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) return matchStatementInvalid(); @@ -254,7 +254,48 @@ shared_ptr Parser::matchExpressionBinary(shared_ptr left } shared_ptr Parser::matchExpressionIfElse() { - return nullptr; + // Try maching '?' + shared_ptr token = tokens.at(currentIndex); + if (token->getKind() != Token::Kind::QUESTION) + return nullptr; + currentIndex++; + + // Then get condition + shared_ptr condition = nextExpression(); + if (condition == nullptr) + return matchExpressionInvalid(); + else if (!condition->isValid()) + return condition; + + // Match ':', '\n', or ':\n' + if (matchesTokenKinds({Token::Kind::COLON, Token::Kind::NEW_LINE})) + currentIndex += 2; + else if (tokens.at(currentIndex)->isOfKind({Token::Kind::COLON, Token::Kind::NEW_LINE})) + currentIndex++; + else + return matchExpressionInvalid(); + + // Match then block + shared_ptr thenBlock = matchStatementBlock(); + if (thenBlock == nullptr) + return matchExpressionInvalid(); + else if (!thenBlock->isValid()) + return matchExpressionInvalid(); // FIXME + + // Match else blcok + shared_ptr elseBlock; + + shared_ptr lastToken = tokens.at(currentIndex-2); + // ':' marks else block + if (lastToken->getKind() == Token::Kind::COLON) { + elseBlock = matchStatementBlock(); + if (elseBlock == nullptr) + return matchExpressionInvalid(); + else if (!elseBlock->isValid()) + return matchExpressionInvalid(); // FIXME + } + + return make_shared(condition, dynamic_pointer_cast(thenBlock), dynamic_pointer_cast(elseBlock)); } shared_ptr Parser::matchExpressionInvalid() { diff --git a/src/Statement.cpp b/src/Statement.cpp index 7c096c3..9d87903 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -65,6 +65,7 @@ string StatementReturn::toString() { string value = "RETURN"; if (expression != nullptr) value += "(" + expression->toString() + ")"; + value += "\n"; return value; }