Это, кажется, бинарная операция, где корнем (под) дерева является оператор 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?