簡體   English   中英

野牛:減少/減少非令牌沖突

[英]Bison: Reduce/reduce conflict on non-tokens

因此,我正在為C創建編譯器,而我目前正在創建文字,變量和函數表。

這條規則使我減少/減少沖突:

lval: ID { check_var(); }
| ID { check_var(); } LBRACK NUM RBRACK
| ID { check_var(); } LBRACK ID { check_var(); } RBRACK;

錯誤如下:

parser.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
parser.y:104.6-21: warning: rule useless in parser due to conflicts [-Wother]
 | ID { check_var(); } LBRACK ID { check_var(); } RBRACK;
      ^^^^^^^^^^^^^^^^

我有優先規則,可以避免減少令牌上的錯誤,但是現在它指向的是非令牌,因此不確定我應該怎么做?

如果有任何幫助,這些是我的優先規則:

%token INPUT OUTPUT WRITE
%token  RETURN VOID IF ELSE WHILE ASSIGN SEMI COMMA
%token LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK
%token NUM ID STRING INT
%left EQ NEQ GE LE GT LT
%left PLUS MINUS
%left TIMES OVER

Bison不會檢查語法中的兩個自定義代碼塊是否相同。 因此,它基本上將您的語法視為:

lval: ID action_1
    | ID action_2 LBRACK NUM RBRACK
    | ID action_3 LBRACK ID action_4 RBRACK
; 

Bison(默認情況下)充當LALR(1)解析器 ,這意味着它僅在做出決定之前就先看一個令牌。 因此,當看到堆棧的頂部是一個ID令牌,而預見令牌是一個LBRACK令牌時,它無法決定是執行action_2還是action_3 ,但不知道它實際上並不重要。

通過使用子規則來解決此問題,該規則組合了在ID后面跟隨LBRACK (以及在其他情況下)時應該發生的常見情況:

id_with_check: ID { check_var(); } ;

lval: id_with_check
    | id_with_check LBRACK NUM RBRACK
    | id_with_check LBRACK id_with_check RBRACK
;

暫無
暫無

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

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