это упоминается в связанном вопросе.
я есть простая грамматика (для демонстрации)
grammar Test;
program
: expression* EOF
;
expression
: Identifier
| expression '(' expression? ')'
| '(' expression ')'
;
Identifier
: [a-zA-Z_] [a-zA-Z_0-9?]*
;
WS
: [ \r\t\n]+ -> channel(HIDDEN)
;
Очевидно, что второй и третий варианты вexpression
правило двусмысленное. Я хочу разрешить эту неоднозначность, разрешив второй вариант, только если выражениесразу последовал по'('
.
Итак, следующее
bar(foo)
должен соответствовать второй альтернативе, а
bar
(foo)
должен соответствовать 1-му и 3-му вариантам (даже если токен между ними находится в канале HIDDEN).
Как я могу это сделать? Я видел эти неоднозначности между выражениями вызовов и выражениями в скобках, присутствующими в языках, которые не имеют (или имеют необязательные) маркеры-терминаторы выражений (или правила) -пример