Поддержка операций сложения и вычитания
This commit is contained in:
parent
cbe463b149
commit
027fc4a524
@ -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() {
|
||||||
|
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