Не леворекурсивная грамматика PEG для «выражения»

Это либо простой идентификатор (например,cow) что-то в квадратных скобках ((...)) то, что выглядит как вызов метода (...(...)) или что-то похожее на членский доступ (thing.member):

def expr = identifier | 
           "(" ~> expr <~ ")" | 
           expr ~ ("(" ~> expr <~ ")") | 
           expr ~ "." ~ identifier

Это дано в синтаксисе Scala Parser Combinator, но это должно быть довольно просто для понимания. Это похоже на то, как выражения выглядят во многих языках программирования (отсюда и названиеexprТем не менее, в его нынешнем виде он является леворекурсивным и приводит к взрыву моего приятного PEG-парсера.

Мне не удалось вычеркнуть левую рекурсию, сохраняя правильность для таких случаев, как(cow.head).moo(dog.run(fast)), Как я могу реорганизовать это, или мне нужно было бы перейти на какой-нибудь генератор синтаксических анализаторов, который может переносить левые рекурсивные грамматики?

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

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