Flex和Bison解析器,两个令牌的字符相同

Flex和Bison解析器,两个令牌的字符相同,bison,flex-lexer,Bison,Flex Lexer,我正在用Bison和Flex做一个小解析器来学习 我有一个问题,我希望能够将二进制或运算符作为 exp | | exp 其中字符“|”两次表示两个表达式的OR运算,一个向左,一个向右 但我也希望能够将绝对值定义为 | exp | 其中字符“|”像括号一样用于表示表达式的绝对值 现在我遇到了解析器无法正确解析字符串的问题,比如 | exp |+exp | 我想将其解析为 (|)(| exp |)+(exp)|) 表示一个表达式与另一个表达式相加的绝对值的绝对值 在这里,我的解析器将前两个管道字符作

我正在用Bison和Flex做一个小解析器来学习

我有一个问题,我希望能够将二进制或运算符作为

exp | | exp

其中字符“|”两次表示两个表达式的OR运算,一个向左,一个向右

但我也希望能够将绝对值定义为

| exp |

其中字符“|”像括号一样用于表示表达式的绝对值

现在我遇到了解析器无法正确解析字符串的问题,比如

| exp |+exp |

我想将其解析为

(|)(| exp |)+(exp)|)

表示一个表达式与另一个表达式相加的绝对值的绝对值

在这里,我的解析器将前两个管道字符作为OR读取,然后发现其余的管道字符有错误,这是有道理的,但不是我想要的

我曾尝试在我的bison文件中为规则赋予不同的优先级,并尝试使flex不识别双管道,但一次只识别一个管道,但我对这两个方面都不精通,无法100%确定我所做的工作的影响

到目前为止,我找到的唯一解决方案是在OR运算符的两侧强制使用空格字符,这虽然有效,但并不美观。我也可以用另一个角色来做一个手术,但我想至少有一点固执,我认为这里有一些东西需要学习

感谢阅读我的问题,我希望有人有一个解决办法的想法


干杯

你的例子很明确。但是你选择对
|a | | | | | | | | | | | | | | | c |
的哪种解释呢<代码>|(a | | |(| b |)、c)|?或者
(|a |)、|b |(|c |)或
?你选择的依据是什么?该死,我没想到这个问题,里希。在这种情况下,我想我会选择
(|a |)、|b | |)(|b |)
我的推理是,我认为对数字进行OR运算比对布尔值的大小进行OR运算更有意义。我认为,这种选择在语法上很难表达。我认为我最终会将字符改为绝对值,但感谢你,我们的例子是明确的。但是你选择对
|a | | | | | | | | | | | | | | | c |
的哪种解释呢<代码>|(a | | |(| b |)、c)|
?或者
(|a |)、|b |(|c |)或
?你选择的依据是什么?该死,我没想到这个问题,里希。在这种情况下,我想我会选择
(|a |)、|b |)(|b |)
我的推理是,我认为对数字进行OR运算比对布尔值的大小进行OR运算更有意义。我认为这种选择在语法上很难表达。我想我最终会将字符改为绝对值,但谢谢