Я пытаюсь рекурсивно разобрать дерево узлов, но каждый дочерний элемент, который я добавляю, оценивает последнее значение.
Пример: при анализе 2 + 3 должен получиться узел, который оценивает 2, и узел, который оценивает3, но вместо этого я получаю 2 узла, которые оцениваются в 3.
. Согласно отладчику, subBefore - это «2», а subAfter - «3», как и должно быть.
Создание новой операциидобавляет аргументы как дети.Почему у меня заканчиваются дети с одинаковым значением?
Код указан ниже.Термин - почти то же самое, но проверяет * и / вместо + и -
Full code:
public class Operation extends ASTNode {
static char op;
private Operation(ASTNode... n) { super(n); }
public static Operation parse(String s) {
String str = s.trim();
if(Term.parse(str) != null) return new Operation(Term.parse(str));
else {
// now make substrings
int lastOpPlus = str.lastIndexOf('+');
int lastOpMinus = str.lastIndexOf('-');
if (lastOpPlus > lastOpMinus) {
op = '+';
String subAfter = str.substring(lastOpPlus+1);
String subBefore = str.substring(0, lastOpPlus);
if(Operation.parse(subBefore)!=null && Term.parse(subAfter) != null) {
return new Operation(Operation.parse(subBefore), Term.parse(subAfter));
}
}
return null;
}
}
public double eval(java.util.Map<String,Double> symtab) {
// first check if state is okay checkState();
if(arity() > 1) {
return (getChild(0).eval(symtab)+getChild(1).eval(symtab));
}
//System.out.println(arity());
//getChild(1).eval(symtab);
else{
return getChild(0).eval(symtab);
}
}
}