как удалить левую рекурсию

Я хотел бы создать грамматику, позволяющую выполнять каррированные вызовы функций.

То есть:

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;

Но это не удается из-за левой рекурсии

5
задан lakam99 9 May 2012 в 00:41
поделиться