簡體   English   中英

野牛:一個錯誤會導致其他但不正確的錯誤

[英]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.

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