解析器组合器 - 有序选择和左递归

时间:2014-01-08 19:39:01

标签: scala

ordered choice有什么意义?它只是意味着你先把最长的模式匹配吗?

假设你有这个表达“

val expr = "eat" ~ "more" ~ "beans" |
           "eat" ~ "more" ~ "beans" ~ "and" ~ "fruit"

由于解析器组合器使用Ordered Choice,字符串eat more beans and soup ...会导致第一行匹配吗? val expr使用Ordered Choice效果不佳,因为它首先包含一个不太具体的表达式?

另外,left recursion是什么?

1 个答案:

答案 0 :(得分:2)

Scala解析器组合器实现解析表达式语法。 PEG取决于无限前瞻和回溯功能的可用性,这使得表达语法变得更容易,因为在解析过程中的任何时候都没有必要做出单方面的决定。

有序选择/交替可以被认为是这种行为的主要推动者;按顺序尝试一系列制作的制作,接受与输入匹配的第一个制作。在上面的示例中,第二个选项将永远不会匹配,因为第一个选项将接受与第二个选项匹配的任何输入。

在给定生成a = b形式的事件中发生左递归,b的扩展以a开头。考虑:

def a = b ~ c
def b = a ~ c

生产a的扩展(匹配)过程如下:

b ~ c  
(a ~ c) ~ c             // substituting b
((b ~ c) ~ c) ~ c       // substituting a
(((a ~ c) ~ c) ~ c) ~ c // substituting b

这实际上是无限的,无终止的递归。