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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage