Семантические предикаты в ANTLR4?
Как бы вы перевели эту часть кода, написанную в ANTLR 3, в ANTLR 4?
expr: (Identifier '.')=> (refIdentifier)
| (Identifier '!')=> (refIdentifier)
| (Identifier '=>')=> (lambdaExpression);
Я имею в виду, что этот вид семантического предиката, кажется, не существует сейчас. Что я мог бы использовать вместо?
1 ответ
В ANTLR v4 больше нет стробированных семантических предикатов, { ... }?=>
и нет больше синтаксических предикатов, ( ... )=>
потому что алгоритм синтаксического анализа, используемый в v4, может разрешить неоднозначности (необходимость в таких предикатах больше не нужна). Итак, это должно работать только для вас:
expr
: refIdentifier
| refIdentifier
| lambdaExpression
;
Обратите внимание, что в v4 существует только один тип предикатов: семантические предикаты, { ... }?
, Например, если вам нужно проверить содержимое токена, вы можете сделать это следующим образом:
id_capitals_only
: {_input.LT(1).getText().matches("[A-Z]+")}? ID
;
ID
: [a-zA-Z]+
;
РЕДАКТИРОВАТЬ
И, как Сэм Харвелл упоминает в комментариях:
Семантические предикаты {...}? в V4 работают так же, как и стробированные семантические предикаты в V3. Непрогашенные предикаты из V3 не имеют аналога в ANTLR 4.