это упоминается в связанном вопросе.

я есть простая грамматика (для демонстрации)

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).

Как я могу это сделать? Я видел эти неоднозначности между выражениями вызовов и выражениями в скобках, присутствующими в языках, которые не имеют (или имеют необязательные) маркеры-терминаторы выражений (или правила) -пример

Ответы на вопрос(1)

Ваш ответ на вопрос