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

В Что такое "семантический предикат" в ANTLR3? Bart Kiers дает очень хороший обзор различных семантических предикатов в 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}?