From 377b7f6df1e80c567c199ad522fd1c3660bf03f5 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 16 Apr 2015 14:55:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B9?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B5=D0=BD=D1=81=D1=82=D0=B2=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Parser.java | 21 ++++++++++++++++++- .../ast/BinaryExpression.java | 5 ++++- 2 files changed, 24 insertions(+), 2 deletions(-) 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()); }