Если оператор для представления дерева в 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)
;
Другие вопросы по тегам