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