c - Bison:减少/减少非 token 上的冲突

标签 c parsing compiler-construction bison

所以我正在为 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 上的错误,但现在它指向一个非 token ,所以不确定我应该做什么?

如果有任何帮助,这些是我的优先规则:

%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) parser ,这意味着它在做出决定之前只向前看一个标记。所以当它看到栈顶是一个ID token,而look-ahead token是一个LBRACK token时,它无法决定是否应该执行action_2action_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
;

关于c - Bison:减少/减少非 token 上的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56333748/

相关文章:

optimization - 什么是好的、免费的 SSA/SCCP 资源?

c++ - OpenCV 窗口卡住

javascript - 了解闭包和方法论

performance - 为什么有些编程语言比其他语言快?

python - 将运算符分配给python中的变量?

parsing - 为什么 time.Parse 不使用时区?

c - 出现 C 错误 "assignment to expression with array type"

c - strtok 不返回任何值

c - 为什么这个 atof() 对于非 0.0 字符串数字返回 0.0?

python - 在 Python 中删除 HTML block