From 7888b94b6abe9ad6b5ff79e8dfc4e87a3b6e3dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Wed, 4 Jun 2025 23:11:07 +0900 Subject: [PATCH] Fixed binary expression --- src/Parser.cpp | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 36d0f0a..cfda9e4 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -126,14 +126,12 @@ shared_ptr Parser::nextExpression() { } shared_ptr Parser::matchEquality() { - shared_ptr expression = matchTerm(); + shared_ptr expression = matchComparison(); if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality)) { - // comaprison + while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality)) expression = matchExpressionBinary(expression); - } return expression; } @@ -143,10 +141,8 @@ shared_ptr Parser::matchComparison() { if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison)) { - // term + while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison)) expression = matchExpressionBinary(expression); - } return expression; } @@ -156,10 +152,8 @@ shared_ptr Parser::matchTerm() { if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm)) { - // factor + while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm)) expression = matchExpressionBinary(expression); - } return expression; } @@ -169,10 +163,8 @@ shared_ptr Parser::matchFactor() { if (expression == nullptr || !expression->isValid()) return expression; - while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor)) { - // unary + while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor)) expression = matchExpressionBinary(expression); - } return expression; } @@ -224,16 +216,28 @@ shared_ptr Parser::matchExpressionGrouping() { shared_ptr Parser::matchExpressionBinary(shared_ptr left) { shared_ptr token = tokens.at(currentIndex); - if (token->isOfKind(Token::tokensBinary)) { + shared_ptr right; + // What level of binary expression are we having? + if (token->isOfKind(Token::tokensEquality)) { currentIndex++; - shared_ptr right = matchFactor(); - if (right == nullptr) { - return matchExpressionInvalid(); - } else if (!right->isValid()) { - return right; - } else { - return make_shared(token, left, right); - } + right = matchComparison(); + } else if (token->isOfKind(Token::tokensComparison)) { + currentIndex++; + right = matchTerm(); + } else if (token->isOfKind(Token::tokensTerm)) { + currentIndex++; + right = matchFactor(); + } else if (token->isOfKind(Token::tokensFactor)) { + currentIndex++; + right = matchPrimary(); + } + + if (right == nullptr) { + return matchExpressionInvalid(); + } else if (!right->isValid()) { + return right; + } else { + return make_shared(token, left, right); } return nullptr;