这是不是一个简单的标识符(如cow
)的东西用方括号括( (...)
的东西,看起来像一个方法调用( ...(...)
或东西,看起来像一个成员访问( thing.member
) :
def expr = identifier |
"(" ~> expr <~ ")" |
expr ~ ("(" ~> expr <~ ")") |
expr ~ "." ~ identifier
它是用Scala解析器组合语法给出的,但它应该是相当简单的了解。 它类似于表达式最终如何寻找在许多编程语言(故名expr
),但因为它的立场,这是左递归,并导致我漂亮的PEG解析器爆炸。
我还没有成功地分解出左递归,同时仍保持正确性情况下,像(cow.head).moo(dog.run(fast))
我该如何重构这个,否则我就需要转移到一些解析器发生器,可以耐受左递归语法?