Fixed binary expression

This commit is contained in:
Rafał Grodziński
2025-06-04 23:11:07 +09:00
parent 4feeb0f8af
commit 7888b94b6a

View File

@@ -126,14 +126,12 @@ shared_ptr<Expression> Parser::nextExpression() {
} }
shared_ptr<Expression> Parser::matchEquality() { shared_ptr<Expression> Parser::matchEquality() {
shared_ptr<Expression> expression = matchTerm(); shared_ptr<Expression> expression = matchComparison();
if (expression == nullptr || !expression->isValid()) if (expression == nullptr || !expression->isValid())
return expression; return expression;
while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality)) { while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality))
// comaprison
expression = matchExpressionBinary(expression); expression = matchExpressionBinary(expression);
}
return expression; return expression;
} }
@@ -143,10 +141,8 @@ shared_ptr<Expression> Parser::matchComparison() {
if (expression == nullptr || !expression->isValid()) if (expression == nullptr || !expression->isValid())
return expression; return expression;
while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison)) { while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison))
// term
expression = matchExpressionBinary(expression); expression = matchExpressionBinary(expression);
}
return expression; return expression;
} }
@@ -156,10 +152,8 @@ shared_ptr<Expression> Parser::matchTerm() {
if (expression == nullptr || !expression->isValid()) if (expression == nullptr || !expression->isValid())
return expression; return expression;
while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm)) { while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm))
// factor
expression = matchExpressionBinary(expression); expression = matchExpressionBinary(expression);
}
return expression; return expression;
} }
@@ -169,10 +163,8 @@ shared_ptr<Expression> Parser::matchFactor() {
if (expression == nullptr || !expression->isValid()) if (expression == nullptr || !expression->isValid())
return expression; return expression;
while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor)) { while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor))
// unary
expression = matchExpressionBinary(expression); expression = matchExpressionBinary(expression);
}
return expression; return expression;
} }
@@ -224,16 +216,28 @@ shared_ptr<Expression> Parser::matchExpressionGrouping() {
shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left) { shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left) {
shared_ptr<Token> token = tokens.at(currentIndex); shared_ptr<Token> token = tokens.at(currentIndex);
if (token->isOfKind(Token::tokensBinary)) { shared_ptr<Expression> right;
// What level of binary expression are we having?
if (token->isOfKind(Token::tokensEquality)) {
currentIndex++; currentIndex++;
shared_ptr<Expression> right = matchFactor(); right = matchComparison();
if (right == nullptr) { } else if (token->isOfKind(Token::tokensComparison)) {
return matchExpressionInvalid(); currentIndex++;
} else if (!right->isValid()) { right = matchTerm();
return right; } else if (token->isOfKind(Token::tokensTerm)) {
} else { currentIndex++;
return make_shared<ExpressionBinary>(token, left, right); 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<ExpressionBinary>(token, left, right);
} }
return nullptr; return nullptr;