Семантические предикаты в 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.