Правило AST для операций повторного запуска в ANTLR - PullRequest
0 голосов
/ 27 января 2012

Интересно узнать, как написать правило перезаписи для создания дерева AST для этого правила.

e5    : (simpleexpression) (relop simpleexpression)* 
      ;

relop : RELOP_GT 
      | RELOP_LT 
      | RELOP_GE 
      | RELOP_LE 
      ;

1 Ответ

0 голосов
/ 27 января 2012

Это, кажется, бинарная операция, где корнем (под) дерева является оператор relop, а листьями - simpleexpression с.В этом случае просто используйте встроенный оператор дерева ^, который превращает токен / дерево перед ним в корень:

e5    : simpleexpression (relop^ simpleexpression)? 
      ;

relop : RELOP_GT 
      | RELOP_LT 
      | RELOP_GE 
      | RELOP_LE 
      ;

Обратите внимание, что я изменяю * на ?, так как ваш оригиналПравило будет принимать ввод, как:

1 <= 2 < 3

Во многих языках программирования, которые оцениваются как:

true < 3

, что можно считать недопустимым выражением (ваш язык, конечно, может принять егов этом случае оставьте *!).

Со встроенным ^ выражение

1 <= 2

будет проанализировано в следующем AST:

  <=
 /  \
1    2

Также см .: Как вывести AST, построенный с использованием ANTLR?

...