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