簡體   English   中英

回溯以下語法的遞歸下降解析器

[英]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 Zb -> ZZ / Za將不匹配ZZ

感謝您的回復Rici。

我更仔細地閱讀了福特的論文,它重申了您所說的話。 PEG /運算符既有序貪婪。 因此,上述規則應該會失敗。

-帕特里克

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM