Я хотел бы создать грамматику, позволяющую выполнять каррированные вызовы функций.
То есть:
a() /// good
a()() /// good
a()()() /// good
a(a) /// good
a(a()()) /// good
/// etc
Мой первый удар был это:
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
fncall : expr '(' (expr (',' expr)*)? ')';
expr : ID|fncall;
Но это не удается из-за левой рекурсии