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
是什么?
答案 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
这实际上是无限的,无终止的递归。