2014-01-08 44 views
2

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

回答

2

Scala的解析器組合實現解析表達式grammers。AP EG基於無限前瞻和回溯能力的可用性而預測,這使得語法表達更容易,因爲在解析過程的任何時刻都不需要做出單方面的決定。

有序的選擇/替代可以被認爲是這種行爲的主要推動者;一個生產序列按順序嘗試,接受與輸入相匹配的第一個生產。在上面的例子中,第二個選項永遠不會匹配,因爲任何匹配第二個選擇的輸入都會被第一個選擇接受。

如果產生了a = b的形式,擴展ba開始,則發生左遞歸。考慮:生產a收益

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

擴展(匹配),如下所示:

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

這實際上是無限的,無端接遞歸。