Если оператор для представления дерева в ANTLR
У меня есть следующее выражение if, которое правильно анализирует:
ifStatement
: 'IF' expression 'THEN' statementBlock
(options {greedy=true;}
: 'ELSE' statementBlock)?
;
Теперь я хочу разобрать это в AST. Вот как я это сделал:
ifStatement
: 'IF'^ expression 'THEN'! statementBlock
(options {greedy=true;}
: 'ELSE'! statementBlock)?
;
добавленной !
а также ^
, как ->
инструкция по сборке не сработала.
Мой результат - AST с 3 дочерними элементами: 1 - условный, 2 и 3 - блоки операторов. Часть else является необязательной: если еще нет, узел 3 отсутствует.
Проблема в том, что блоки операторов всегда пусты. Как это исправить?
1 ответ
Ниже в основном то, как я это реализовал. Обратите внимание, что "IF", "THEN" и "ELSE" объявлены в разделе "токены"
ifStatement
: IF expression THEN ifStat=statementBlock
( ELSE elseStat=statementBlock -> ^(IF expression $ifStat $elseStat)
| -> ^(IF expression $ifStat)
)
;
[править] Или вы могли бы быть более явным, который также должен работать
ifStatement
: IF expression THEN ifStat=statementBlock ELSE elseStat=statementBlock -> ^(IF expression $ifStat $elseStat)
| IF expression THEN ifStat=statementBlock -> ^(IF expression $ifStat)
;