From 027fc4a5249b64b3cb44532ffd7cb34d46baac7d Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 16 Apr 2015 14:40:37 +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=D1=81=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20?= =?UTF-8?q?=D0=B2=D1=8B=D1=87=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D1=8F?= 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 | 32 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/com/annimon/everlastingsummer/ast/BinaryExpression.java diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 5eb4d4d..7b8b288 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import com.annimon.everlastingsummer.ast.*; +import com.annimon.everlastingsummer.ast.BinaryExpression.Operator; import android.text.TextUtils; /** @@ -411,7 +412,25 @@ public final class Parser { } private Expression expression() { - return unary(); + return additive(); + } + + private Expression additive() { + Expression expression = unary(); + + while (true) { + if (match(TokenType.PLUS)) { + expression = new BinaryExpression(Operator.ADD, expression, unary()); + continue; + } + if (match(TokenType.MINUS)) { + expression = new BinaryExpression(Operator.SUBTRACT, expression, unary()); + continue; + } + break; + } + + return expression; } private Expression unary() { diff --git a/src/com/annimon/everlastingsummer/ast/BinaryExpression.java b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java new file mode 100644 index 0000000..a5c8e34 --- /dev/null +++ b/src/com/annimon/everlastingsummer/ast/BinaryExpression.java @@ -0,0 +1,32 @@ +package com.annimon.everlastingsummer.ast; + +/** + * @author aNNiMON + */ +public class BinaryExpression implements Expression { + + public static enum Operator { + ADD, SUBTRACT + } + + public final Operator operator; + private final Expression left, right; + + public BinaryExpression(Operator op, Expression left, Expression right) { + this.operator = op; + this.left = left; + this.right = right; + } + + @Override + public double eval() { + final double leftVal = left.eval(); + final double rightVal = right.eval(); + switch (operator) { + case ADD: return leftVal + rightVal; + case SUBTRACT: return leftVal - rightVal; + default: + throw new RuntimeException("Неизвестный оператор " + operator.name()); + } + } +}