Рекурсивное создание / разбор детей в Java - PullRequest
1 голос
/ 11 марта 2011

Я пытаюсь рекурсивно разобрать дерево узлов, но каждый дочерний элемент, который я добавляю, оценивает последнее значение.

Пример: при анализе 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);
      }
  }

}

1 Ответ

1 голос
/ 11 марта 2011

Трудно сказать, не видя код для Operation.parse, Term.parse и конструктор Operation, но я предполагаю, что вы разделяете буфер или переменную где-то.

В отдельном примечании, вы выполняете работу разбора дважды. Было бы хорошо реорганизовать ваш код следующим образом:

Object before = Operation.parse(subBefore); // a more specific type, not Object
Object after = Term.parse(subAfter);
if (before != null && after != null) {
    return new Operation(before, after);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...