2015-04-03 5 views
0

Итак, в моем классе компиляторов мы используем JDT для представления нашего подмножества Java. У меня уже есть работа, и я подумал, что было бы неплохо реализовать приращение/декремент, понизив ее до назначения. Я понял, набрав это, потому что выражение, увеличивающееся, может иметь эффект, это не действует на 100%. Тем не менее я хочу сделать что-то подобное для петель.checkNewChild вызывает ошибку при понижении кода JDT

Так что у меня этот код

@Override 
    public boolean visit(final PostfixExpression node) { 
     //in this we lower an inc/dec expression to an assignment 
     NumberLiteral one = node.getAST().newNumberLiteral(); 
     one.setToken(new Integer(1).toString()); 
     InfixExpression ie = node.getAST().newInfixExpression(); 
     ie.setLeftOperand(node.getOperand()); 
     ie.setRightOperand(one); 
     if(node.getOperator() == PostfixExpression.Operator.INCREMENT) { 
      ie.setOperator(InfixExpression.Operator.PLUS); 
     } else { 
      ie.setOperator(InfixExpression.Operator.MINUS); 
     } 
     Assignment a = node.getAST().newAssignment(); 
     a.setLeftHandSide(node.getOperand()); 
     a.setRightHandSide(ie); 
     //finally just lower the increment to the assignment 
     return this.visit(a); 
    } 

, но когда он выполняет, я получаю сообщение об ошибке, как только я пытаюсь установить левый операнд выражения инфиксной.

ошибка

java.lang.IllegalArgumentException 
at org.eclipse.jdt.core.dom.ASTNode.checkNewChild(ASTNode.java:2087) 
at org.eclipse.jdt.core.dom.ASTNode.preReplaceChild(ASTNode.java:2149) 
at org.eclipse.jdt.core.dom.InfixExpression.setLeftOperand(InfixExpression.java:437) 
... 

Так моя догадка, что дети должны быть уникальными. Это так? Если это так, то как снижается реализация? Если это не так, что здесь происходит?

ответ

0

Также столкнулся с этой проблемой. Это было просто выяснить:

java.lang.IllegalArgumentException на org.eclipse.jdt.core.dom.ASTNode.checkNewChild (ASTNode.java:2087)

Перейти к sources и проверить линии 2087.

if (newChild.getParent() != null) { 
     // new child currently has a different parent 
     throw new IllegalArgumentException(); 
    } 

проблема заключается в том, вы не можете добавить узел в дереве, если узел уже существует (это требуется tree structure). Я вижу следующие пути решения этой проблемы:

  1. Копирование узла и его поддерево с ASTNode.copySubtree(astNode.getAST(), astNode)
  2. Удаление узла из дерева с astNode.delete()

 Смежные вопросы

  • Нет связанных вопросов^_^