gpt4 book ai didi

c - 词法中包含的运算符 (bison/flex)

转载 作者:行者123 更新时间:2023-11-30 15:41:01 25 4
gpt4 key购买 nike

我很难弄清楚如何解决这个问题。基本上(这对于任何运算符都是有值(value)的,但我使用“+”作为示例),假设我们在词法分析器源代码中有这条规则:

[+-]?[0-9]+  { yylval = atoi(yytext); return INTEGER; }

并且,在paser中,我们会有

exp: INTEGER
| exp '+' exp { $$ = $1 + $3; }
| // etc etc

然后,在生成的计算器中,如果我这样做

2 + 2

它会按预期工作并给我数字 4。

但如果我这样做

2+2

即2、+ 和其他 2 之间没有空格,我有语法错误。原因是“+2”本身是一个标记,因此 bison 读取“exp exp”并没有找到任何内容,因为它不是解析器规则的一部分。

但是,这条线

2++2

很好,因为 Bison 会执行“2”+“+2”。

我的问题是...我们如何解决该行为,以便“2+2”与“2 + 2”的工作方式相同?

<小时/>

编辑:正如下面的评论所指出的,这个问题似乎是另一个问题的重复。好吧,我已经部分找到了答案,但仍然如此。

如果我们将其作为解析器的工作,并为一元规则定义自定义优先级,如下所示:

exp:
| // bla bla bla
| '+' exp %prec UPLUS { $$ = +$2; }
| '-' exp %prec UMINUS { $$ = -$2; }

我仍然发现一个问题。事实上,从技术上来说,我们可以在计算器中做到这一点:

2+++++2
4
2+++++++++++2
4
2++++3
5

有没有办法避免这种丑陋的语法并触发错误或至少警告,以便只允许 2+2,更糟糕的是,只允许 2+2 和 2++2,这是只有两个选择有意义!

谢谢!

最佳答案

一元运算符最好在语法中处理,而不是在扫描器中处理。没有理由以艰难的方式做到这一点。只需允许在“primary”的产生式中使用一元运算符“+”和“-”;忽略一元“+”;如果一元“-”运算符的数量为奇数,则输出代码对操作数取反。

然后去掉[-+]?在 lex 规范中。目前您似乎正在尝试在两个地方处理它。

也没有理由禁止一元运算符及其操作数之间存在空格,或者只允许一个一元运算符,而这正是在词法分析器中处理它的做法。在语法中这样做。只是。

关于c - 词法中包含的运算符 (bison/flex),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20717636/

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