[英]bison: one error causes additional but incorrect error
在我的代碼的類部分中,如果我寫了一個錯誤,則在不應該的情況下將報告幾行錯誤。 我把' | error
| error
'可以從錯誤中恢復的很好/安全的某些位置,但我認為它沒有使用它。 也許它正試圖在某個地方恢復中間表情?
有沒有一種方法可以迫使野牛嘗試在指定的位置恢復? 它是如何工作的,我可能做錯了什么?
我將錯誤行放在循環旁邊。 這是一個例子:
SomeRuleLoop:
| Rule ',' SomeRuleLoop
Rule:
A
| B
| C
| Error
A:
AA AAB AABC
| AA AAB AABC Z
...
這是我的規則示例。 我在控制台中看到“ funcBody錯誤”,但是由於第一個錯誤,下一行出現了錯誤。 即使每個funcBodyRule是獨立的。
funcBodyLoop:
| funcBodyLoop funcBody
funcBody:
funcBodyRule
| error { printf("funcBody error"); $$=0; }
| '#' EQ { printf("still in funcBody\n"); $$=0; }
我嘗試在第一個錯誤的行和第二個錯誤的行之間編寫#==。 我寫這個來檢查解析器是否仍然在funcbody循環中。
這不會給出錯誤,而是
。 沒關系,我添加了printf並且未打印字符串,所以也許它不再存在於函數循環中? 我該如何解決?
Yacc和Bison通常使用左遞歸規則,顯示的規則不是左遞歸。
如圖所示,第一個規則等效於:
SomeRuleLoop:
/* Nothing */
| Rule ',' SomeRuleLoop
;
這是一條右遞歸規則,它表示“ SomeRuleLoop”是一個空的令牌字符串或“ Rule”,后跟一個逗號和更多的“ SomeRuleLoop”。 請注意,這意味着“ SomeRuleLoop”以逗號結尾,這可能與您的想法不符。
第一條規則應為:
SomeRuleLoop:
Rule
| SomeRuleLoop ',' Rule
;
請注意,允許使用空的替代品很重要-但是將其添加到各處往往會使語法變得模棱兩可(更多的移位/減少沖突)
您還需要使用標記“錯誤”(所有小寫)而不是“錯誤”(混合大小寫)來指示可能發生錯誤恢復的點。
但是,我不確定您其余的麻煩是什么...
強制';' 或錯誤末尾的換行符可以解決該問題。 ( | error my_end_of_statenent
而不是| error
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.