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