これは、単純な識別子(のようなcow
)かっこで囲まれたもの((...)
)、メソッド呼び出しのような...(...)
もの()、またはメンバーアクセスのようなもの()のいずれかですthing.member
。
def expr = identifier |
"(" ~> expr <~ ")" |
expr ~ ("(" ~> expr <~ ")") |
expr ~ "." ~ identifier
これはScalaParserCombinator構文で与えられていますが、理解するのはかなり簡単なはずです。これは、式が多くのプログラミング言語でどのように見えるかと似ています(そのため名前が付けexpr
られています)。ただし、現状では、左再帰であり、私の素敵なPEGパーサーが爆発します。
のような場合の正確さを維持しながら、左再帰を因数分解することに成功していません(cow.head).moo(dog.run(fast))
。これをリファクタリングするにはどうすればよいですか、または左再帰文法を許容できるパーサジェネレータにシフトする必要がありますか?