Изменить приоритет оператора - PullRequest
7 голосов
/ 05 июня 2011

Как лучше всего изменить приоритет оператора для конкретного выражения?

Например, у меня есть класс:

class A(){ 
   def multiply(a) { 
       ... 
   } 

   def plus(a) { 
       ... 
   } 

   def minus(b) {
       ...
   }

} 

a = new A() 
b = new A() 
c = new A() 

d = a + (b - c) * d

Поскольку умножение имеет более высокий приоритет, чем + и- Я получаю AST формы

  +
 / \
a   *
   / \
  -   d
 / \
b   c

Какой самый простой способ преобразовать его в дерево, где * имеет более низкий приоритет, чем + и -.Я предполагаю, что круглые скобки разрешены только для групп - и +, то есть выражение (a * b - c) * d недопустимо и не должно ожидаться в качестве ввода.

Ответы [ 2 ]

4 голосов
/ 05 июня 2011

Вы можете просто добавить скобки в свой код. Это, вероятно, сделает ваш код намного проще для понимания, чем использование преобразования AST.

3 голосов
/ 06 июня 2011

Вы могли бы изменить его, используя преобразование AST, но было бы сложно получить правильное представление ...

Если вы загрузите свой скрипт в GroovyConsole, а затем откроетеВ браузере AST вы увидите это дерево для назначения:

Binary - ( d = ( a & ( b >> c ) ) )
  Variable - d
  Binary - ( a & ( b >> c ) )
    Variable - a
    Binary - ( b >> c )
      Variable - b
      Variable - c

Таким образом, как вы можете видеть, узлы выполняются на основе приоритета оператора по умолчанию и дерева org.codehaus.groovy.ast.expr.BinaryExpression и org.codehaus.groovy.ast.expr.VariableExpression узлов AST

Вам потребуется написать преобразование AST, которое сканирует дерево на наличие узлов BinaryExpression, а затем переупорядочить эти деревья, чтобы они сортировались по вашему собственному приоритету для поля operation.

Или вы можете просто использовать круглые скобки в своем коде, как предлагает Дон: -)

...