Fixed binary expression
This commit is contained in:
@@ -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,9 +216,22 @@ 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();
|
||||||
|
} 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) {
|
if (right == nullptr) {
|
||||||
return matchExpressionInvalid();
|
return matchExpressionInvalid();
|
||||||
} else if (!right->isValid()) {
|
} else if (!right->isValid()) {
|
||||||
@@ -234,7 +239,6 @@ shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left
|
|||||||
} else {
|
} else {
|
||||||
return make_shared<ExpressionBinary>(token, left, right);
|
return make_shared<ExpressionBinary>(token, left, right);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user