diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 7b8b288..c9f1a08 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -412,7 +412,26 @@ public final class Parser { } 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() { diff --git a/src/com/annimon/everlastingsummer/ast/BinaryExpression.java b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java index a5c8e34..50dbfcc 100644 --- a/src/com/annimon/everlastingsummer/ast/BinaryExpression.java +++ b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java @@ -6,7 +6,8 @@ package com.annimon.everlastingsummer.ast; public class BinaryExpression implements Expression { public static enum Operator { - ADD, SUBTRACT + ADD, SUBTRACT, + EQUALS, NOTEQUALS, } public final Operator operator; @@ -25,6 +26,8 @@ public class BinaryExpression implements Expression { switch (operator) { case ADD: return leftVal + rightVal; case SUBTRACT: return leftVal - rightVal; + case EQUALS: return (leftVal == rightVal) ? 1 : 0; + case NOTEQUALS: return (leftVal != rightVal) ? 1 : 0; default: throw new RuntimeException("Неизвестный оператор " + operator.name()); }