非左递归语法P​​EG为“表达”(Non-left-recursive PEG grammar fo

2019-08-02 17:48发布

这是不是一个简单的标识符(如cow )的东西用方括号括( (...)的东西,看起来像一个方法调用( ...(...)或东西,看起来像一个成员访问( thing.member ) :

def expr = identifier | 
           "(" ~> expr <~ ")" | 
           expr ~ ("(" ~> expr <~ ")") | 
           expr ~ "." ~ identifier

它是用Scala解析器组合语法给出的,但它应该是相当简单的了解。 它类似于表达式最终如何寻找在许多编程语言(故名expr ),但因为它的立场,这是左递归,并导致我漂亮的PEG解析器爆炸。

我还没有成功地分解出左递归,同时仍保持正确性情况下,像(cow.head).moo(dog.run(fast)) 我该如何重构这个,否则我就需要转移到一些解析器发生器,可以耐受左递归语法?

Answer 1:

关键是要具有多个规则,其中每个规则的第一个元素是下一个规则而不是被以同样的规则递归调用,并且规则的其余部分是可选的,并且重复。 例如下面会为您的工作,例如:

def expr              = method_call
def method_call       = member_access ~ ( "(" ~> expr <~ ")" ).*
def member_access     = atomic_expression ~ ( "." ~> identifier).*
def atomic_expression = identifier |
                        "(" ~> expr  <~ ")"


文章来源: Non-left-recursive PEG grammar for an “expression”