Синтаксис семантических предикатов в 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}?