Поддержка операций проверки равенства

This commit is contained in:
Victor 2015-04-16 14:55:51 +03:00
parent 027fc4a524
commit 377b7f6df1
2 changed files with 24 additions and 2 deletions

View File

@ -412,7 +412,26 @@ public final class Parser {
} }
private Expression expression() { private Expression expression() {
return additive(); return equality();
}
private Expression equality() {
Expression expression = additive();
if (lookMatch(1, TokenType.EQ)) {
if (match(TokenType.EQ)) {
// ==
match(TokenType.EQ);
return new BinaryExpression(Operator.EQUALS, expression, additive());
}
if (match(TokenType.EXCL)) {
// !=
match(TokenType.EQ);
return new BinaryExpression(Operator.NOTEQUALS, expression, additive());
}
}
return expression;
} }
private Expression additive() { private Expression additive() {

View File

@ -6,7 +6,8 @@ package com.annimon.everlastingsummer.ast;
public class BinaryExpression implements Expression { public class BinaryExpression implements Expression {
public static enum Operator { public static enum Operator {
ADD, SUBTRACT ADD, SUBTRACT,
EQUALS, NOTEQUALS,
} }
public final Operator operator; public final Operator operator;
@ -25,6 +26,8 @@ public class BinaryExpression implements Expression {
switch (operator) { switch (operator) {
case ADD: return leftVal + rightVal; case ADD: return leftVal + rightVal;
case SUBTRACT: return leftVal - rightVal; case SUBTRACT: return leftVal - rightVal;
case EQUALS: return (leftVal == rightVal) ? 1 : 0;
case NOTEQUALS: return (leftVal != rightVal) ? 1 : 0;
default: default:
throw new RuntimeException("Неизвестный оператор " + operator.name()); throw new RuntimeException("Неизвестный оператор " + operator.name());
} }