C 同等优先的移位/减少
我必须为C的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展不太顺利。然而。我目前正试图为所述子集构建一个词法分析器和解析器 我决定一件一件地构建它,并在出现错误时修复它们。所以我有一个基本语法,如下所示。这个语法解析正确,我可以做简单的数学运算,包括比较运算符。因为thsi是C的子集,它们返回整数值,所以这是可能的 现在是棘手的部分。我还想(需要)在C 同等优先的移位/减少,c,parsing,bison,C,Parsing,Bison,我必须为C的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展不太顺利。然而。我目前正试图为所述子集构建一个词法分析器和解析器 我决定一件一件地构建它,并在出现错误时修复它们。所以我有一个基本语法,如下所示。这个语法解析正确,我可以做简单的数学运算,包括比较运算符。因为thsi是C的子集,它们返回整数值,所以这是可能的 现在是棘手的部分。我还想(需要)在中建模和-作为一元运算符,表示-5+5应该等于0 由于这两个一元运算符约束最紧,我想我需要将它们放在语法的term子句中。因此
中建模
和-
作为一元运算符,表示-5+5应该等于0
由于这两个一元运算符约束最紧,我想我需要将它们放在语法的term子句中。因此,我将我的条款改为:
term : NUMBER
| NOT term { printf("NOT term\n"); $$ = !$2; }
| SUB term { printf("MINUS term\n"); $$ = - ($2);}
| LEFTPAR exp RIGHTPAR { printf("expression between parents\n");$$ = $2; }
|
;
bison -dv bison.y
bison.y: conflicts: 12 shift/reduce
flex lex.l
cc -o calc bison.tab.c lex.yy.c -lfl
然而,这使得野牛抱怨移位/减少错误。我知道如何解决这些问题的基本知识,但是,这会在几乎所有可能的状态下产生移位/减少错误,所以我现在有点困惑
我可以通过选择-
而不是,在语法中增加更多的优先级代码>但它们同样紧密
整个语法
calclist : /* nothing */
| COMMENT { printf("Comment\n"); }
| calclist comp EOL { printf("= %d\n", $2); }
;
comp : exp
| comp GREATER exp { printf("comp GREATER factor\n");$$ = $1 > $3; }
| comp LESS exp { printf("comp LESS factor\n");$$ = $1 < $3; }
| comp EQUAL exp { printf("comp EQUAL factor\n");$$ = $1 == $3; }
| comp NEQUAL exp { printf("comp NEQUAL factor\n");$$ = $1 != $3; }
;
exp : factor
| exp ADD factor { printf("exp add factor\n");$$ = $1 + $3; }
| exp SUB factor { printf("exp sub factor\n");$$ = $1 - $3; }
;
factor : term
| factor MUL term { printf("factor mul term\n");$$ = $1 * $3; }
| factor DIV term { printf("factor div term\n");$$ = $1 / $3; }
;
term : NUMBER
| NOT term { printf("NOT term\n"); $$ = !$2; }
| SUB term { printf("MINUS term\n"); $$ = - ($2);}
| LEFTPAR exp RIGHTPAR { printf("expression between parents\n");$$ = $2; }
|
;
我不打算在这里粘贴整个bison.output文件,因为这是一个相当长的文件
编辑:
下面粘贴的语法不包含SUB
标记。添加它以便可以复制粘贴
term : NUMBER
| NOT term { printf("NOT term\n"); $$ = !$2; }
| LEFTPAR exp RIGHTPAR { printf("expression between parents\n");$$ = $2; }
问题就在这里,空生产。把它拿走
|
;
哦,天哪。。非常感谢!:)你能向我解释一下(如果你这么做的话)你是如何从野牛的产出中得出这个结论的吗?还是你只是有经验?无论如何谢谢你!刚刚查看了y.output
文件中的冲突,在状态2中有一个SUB的移位,与规则19冲突,查看规则19,oops19 |%empty