Nicht linksrekursive PEG-Grammatik für einen „Ausdruck“
Es ist entweder eine einfache Kennung (wiecow
) etwas in Klammern ((...)
) etwas, das wie ein Methodenaufruf aussieht (...(...)
) oder etwas, das aussieht wie ein Mitglied Zugang (thing.member
):
def expr = identifier |
"(" ~> expr <~ ")" |
expr ~ ("(" ~> expr <~ ")") |
expr ~ "." ~ identifier
Es ist in der Scala Parser Combinator-Syntax angegeben, sollte aber ziemlich einfach zu verstehen sein. Es ähnelt dem Aussehen von Ausdrücken in vielen Programmiersprachen (daher der Nameexpr
) So wie es aussieht, ist es jedoch rekursiv und lässt meinen netten PEG-Parser explodieren.
Es ist mir nicht gelungen, die Linksrekursion auszublenden und trotzdem die Korrektheit für Fälle wie diesen beizubehalten(cow.head).moo(dog.run(fast))
. Wie kann ich das umgestalten, oder müsste ich zu einem Parser-Generator wechseln, der rekursive Grammatiken von links tolerieren kann?