Не леворекурсивная грамматика PEG для «выражения»
Это либо простой идентификатор (например,cow
) что-то в квадратных скобках ((...)
) то, что выглядит как вызов метода (...(...)
) или что-то похожее на членский доступ (thing.member
):
def expr = identifier |
"(" ~> expr <~ ")" |
expr ~ ("(" ~> expr <~ ")") |
expr ~ "." ~ identifier
Это дано в синтаксисе Scala Parser Combinator, но это должно быть довольно просто для понимания. Это похоже на то, как выражения выглядят во многих языках программирования (отсюда и названиеexpr
Тем не менее, в его нынешнем виде он является леворекурсивным и приводит к взрыву моего приятного PEG-парсера.
Мне не удалось вычеркнуть левую рекурсию, сохраняя правильность для таких случаев, как(cow.head).moo(dog.run(fast))
, Как я могу реорганизовать это, или мне нужно было бы перейти на какой-нибудь генератор синтаксических анализаторов, который может переносить левые рекурсивные грамматики?