Поддержка операций сложения и вычитания
This commit is contained in:
parent
cbe463b149
commit
027fc4a524
@ -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() {
|
||||
|
32
src/com/annimon/everlastingsummer/ast/BinaryExpression.java
Normal file
32
src/com/annimon/everlastingsummer/ast/BinaryExpression.java
Normal 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());
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user