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

This commit is contained in:
Victor 2015-04-16 14:40:37 +03:00
parent cbe463b149
commit 027fc4a524
2 changed files with 52 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import com.annimon.everlastingsummer.ast.*; import com.annimon.everlastingsummer.ast.*;
import com.annimon.everlastingsummer.ast.BinaryExpression.Operator;
import android.text.TextUtils; import android.text.TextUtils;
/** /**
@ -411,7 +412,25 @@ public final class Parser {
} }
private Expression expression() { 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() { private Expression unary() {

View File

@ -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());
}
}
}