2011-07-17 53 views
4

parsing expression grammar(PEG)中是否存在表達「無序序列」的(簡單)方法?規則如解析無序序列並解析表達式語法

Rule <- A B C 

要求A,B和C按順序匹配。規則如

Rule <- (A B C)/(B C A)/(C A B)/(A C B)/(C B A)/(B A C) 

允許他們以任何順序相匹配(這是我們所希望的),但它與序列中更多方面的做法繁瑣和不適用的。

是唯一的解決方案中使用的

Rule <- (A/B/C){3} 

一個語法規則寬鬆等和語義檢查每個規則只有一次比賽嗎?

事實上,例如Relax NG Compact Syntax有一個"unordered list" operator來解析XML,這讓我暗示沒有明顯的解決方案。

最後一個問題:你認爲添加這樣一個操作符會給PEG帶來不明確的地方嗎?

回答

1

無論您選擇何種解析引擎(例如,PEG,LALR,LL(k),...),語法規則都會精確地表達您想要的表單序列。

表達你想要所有可能的使用BNF規則的東西的序列的唯一方法是你提出的醜陋的規則。

標準的解決方案是簡單地定義:

rule <- (A | B | C)* 

(或任何語法解析器發生器接受列表)和語義計算的是僅提供了3種形式,他們是獨一無二的。

通常,構建解析器生成器的人會添加特殊的「擴展BNF」符號以使其描述特殊情況;您舉了一個例子,使用{3}作爲特殊語法,暗示您只希望解析器生成器接受該表示法並且執行相應的強制實施時只需要「3」。可以想象一個擴展符號{unique}讓你描述你的情況。我從來沒有見過實現這個想法的解析器生成器。