![](/img/trans.png)
[英]Can this grammar be parsed by both predictive recursive descent parser and the parser with backtracking
[英]Backtracking Recursive Descent Parser for the following grammar
我試圖找出一些涉及解析表達式語法的細節,並停留在以下問題上:
對於給定的語法:
a = b Z
b = Z Z | Z
(其中小寫字母表示生產,大寫字母表示終端)。 產品“ a”是否應該與字符串“ ZZ”匹配?
這是我已將上述語法轉換為的偽代碼,其中每個產生形式都映射到一個輸出兩個值的函數。 第一個指示解析是否成功。 第二個表示解析后流中的結果位置。
defn parse-a (i:Int) -> [True|False, Int] :
val [r1, i1] = parse-b(i)
if r1 : eat("Z", i1)
else : [false, i]
defn parse-b1 (i:Int) -> [True|False, Int] :
val [r1, i1] = eat("Z", i)
if r1 : eat("Z", i1)
else : [false, i]
defn parse-b2 (i:Int) -> [True|False, Int] :
eat("Z", i)
defn parse-b (i:Int) -> [True|False, Int] :
val [r1, i1] = parse-b1(i)
if r1 : [r1, i1]
else : parse-b2(i)
嘗試解析輸入“ ZZ”上的產生式“ a”時,以上代碼將失敗。 這是因為“ b”的解析功能不正確。 它將貪婪地消耗輸入中的兩個Z並成功,然后不留任何內容進行解析。 這是解析表達式語法應該做的嗎? 福特論文中的偽代碼似乎表明了這一點。
非常感謝。
-帕特里克
在PEG中,析取詞(替代詞)確實是有序的。 在福特的論文中,運算符被寫為/並被稱為“有序選擇”,這將其與|進行了區分。 析取運算符。
這使得PEG從根本上不同於CFG。 特別地,給定PEG規則b -> ZZ / Z
a -> b Z
和b -> ZZ / Z
, a
將不匹配ZZ
。
感謝您的回復Rici。
我更仔細地閱讀了福特的論文,它重申了您所說的話。 PEG /運算符既有序又貪婪。 因此,上述規則應該會失敗。
-帕特里克
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.