我使用檸檬作爲解析器生成器,其錯誤處理與yacc和野牛的相同,如果您不知道檸檬。在解析(檸檬)中恢復錯誤標記
檸檬有一個選項可以在一組規則中定義錯誤標記以捕獲分析錯誤。生成的解析器的默認行爲是銷燬導致錯誤的令牌;有什麼方法可以重寫這種行爲,以便我可以保持令牌?
下面就來展示一下發生的事情爲例:基本上我追加令牌每個規則一起改革輸入字符串,這裏是一個例子語法:
input ::= string(A) { printf("%s", A); } // Print the result
string(A) ::= string(B) part(C). { A = append(B, C); }
string(A) ::= part(B). { A = B; }
part(A) ::= NUMBER(B) NAME(C). { A = append(C, B); } // Rearrange the number and name
part(A) ::= error(B). { A = B; } // On error keep the token anyways
對於輸入:
"Username 1234Joseph"
我得到的輸出:
"Joseph1234"
因爲文本「用戶名」是由解析器中的部分(A):: =錯誤(B)規則,但我確實想要:
"Username Joseph1234"
作爲輸出。
如果你能解決野牛或此問題的另一個解析器發生器我會接受,作爲一個答案:)
如果有人感興趣,我最終轉換到RE2C [[link](http://re2c.org/)]。用RE2C宏獲取行爲要容易得多。我編寫了宏,以便任何不匹配的子字符串都是簡單的輸出,而任何匹配的子字符串都是由RE2C修改的。 – 2015-05-05 17:29:15