Синтаксис семантических предикатов в Antlr4

В Что такое "семантический предикат" в ANTLR3? Барт Киерс дает очень хороший обзор различных семантических предикатов в Antlr3.

Жаль, что синтаксис / семантика были, по-видимому, изменены в Antlr4, так что это не компилируется:

end_of_statement
    :   ';'
    |   EOF
    |   {input.LT(1).getType() == RBRACE}? =>
    ;

RBRACE
    : '}'
    ;

Может кто-нибудь сказать мне, как сделать третий случай end_of_statement: примите, если следующий токен является '}', но не используйте его.

1 ответ

Решение

Теперь существует только один тип семантических предикатов, который выглядит следующим образом:

{ <<boolean-epxression>> }?

И input атрибут из абстрактного класса Parser (от которого ваш сгенерированный парсер выходит) теперь имеет подчеркивание перед ним.

Итак, в вашем случае, следующий синтаксис ANTLR v3:

{input.LT(1).getType() == RBRACE}? =>

будет выглядеть так в ANTLR v4:

{_input.LT(1).getType() == RBRACE}?
Другие вопросы по тегам