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

Другие вопросы по тегам