gpt4 book ai didi

c - 以相同的优先级移位/归约

转载 作者:太空狗 更新时间:2023-10-29 15:38:36 25 4
gpt4 key购买 nike

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

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

现在是棘手的部分。我还希望(需要)在 !- 中建模为 unary 运算符,这意味着 -5 + 5 应该等于 0。

由于这两个一元运算符绑定(bind)最紧密,我想我需要将它们放在我的语法的术语子句中。所以我将我的条款条款更改为以下内容:

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 提示移位/归约错误。我知道如何解决这些问题的基础知识,但是,这会在几乎所有可能的状态下产生移位/减少错误,所以我现在有点困惑。

我可以通过选择 - 而不是 ! 来在我的语法中添加更多的优先级,但它们同样严格。

完整语法

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 的输出如下:

bison -dv bison.y
bison.y: conflicts: 12 shift/reduce
flex lex.l
cc -o calc bison.tab.c lex.yy.c -lfl

我不打算在这里粘贴整个 bison.output 文件,因为这是一个相当长的文件。

编辑:

下面粘贴的语法不包含 SUB 标记。添加它以便可以复制粘贴。

最佳答案

term        :   NUMBER
| NOT term { printf("NOT term\n"); $$ = !$2; }
| LEFTPAR exp RIGHTPAR { printf("expression between parents\n");$$ = $2; }

问题就在这里,空生产。只需将其删除即可。

            |   
;

关于c - 以相同的优先级移位/归约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22081662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com