Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 同等优先的移位/减少_C_Parsing_Bison - Fatal编程技术网

C 同等优先的移位/减少

C 同等优先的移位/减少,c,parsing,bison,C,Parsing,Bison,我必须为C的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展不太顺利。然而。我目前正试图为所述子集构建一个词法分析器和解析器 我决定一件一件地构建它,并在出现错误时修复它们。所以我有一个基本语法,如下所示。这个语法解析正确,我可以做简单的数学运算,包括比较运算符。因为thsi是C的子集,它们返回整数值,所以这是可能的 现在是棘手的部分。我还想(需要)在中建模和-作为一元运算符,表示-5+5应该等于0 由于这两个一元运算符约束最紧,我想我需要将它们放在语法的term子句中。因此

我必须为C的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展不太顺利。然而。我目前正试图为所述子集构建一个词法分析器和解析器

我决定一件一件地构建它,并在出现错误时修复它们。所以我有一个基本语法,如下所示。这个语法解析正确,我可以做简单的数学运算,包括比较运算符。因为thsi是C的子集,它们返回整数值,所以这是可能的

现在是棘手的部分。我还想(需要)在
中建模
-
作为一元运算符,表示-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,oops
19 |%empty