解析树中的一元负号和二元负号

7
我正在创建一个解析树,其中包含类似于 3 - 4 * 8 8 * -5 -(10 * 1) 的表达式。我需要一种方法来区分一元和二元减号。按照我的语法规则,二元减号先被执行,但我考虑改变这一点,并添加一个标志变量来保存最后一个变量。
例如:如果是 5 - 6 那么标志变量将保存5,如果它看到减号并且该标志是一个数字,则跳过一元运算符并进行二元运算。
但是我不确定如何在C ++中实现这一点。
非常感谢任何帮助。
谢谢。

1
你的意思是在解析时区分它们的方法,还是在解析树中区分它们的方法?在解析树中,这很简单--只需要有独立的UNARY_MINUSBINARY_MINUS运算符即可。如果你是指在解析时,一元减号发生在你期望出现操作数而不是操作符时。 - Jerry Coffin
在我的解析器中,我希望它能够区分-5和4 -5。我的下一步是将这个树的叶子转换为AST树(这个部分已经工作),但是我的解析器将所有内容都视为二元减法(4 - 5)。 - Dfranc3373
1个回答

8

实现解析器的最简单方法是使用递归下降的方法。请确保给二元减号比一元减号更高的优先级,就像在引用的网站中所示:

 E -->  | E "+" E
        | E "-" E
        | "-" E
        | E "*" E
        | E "/" E
        | E "^" E
        | "(" E ")"
        | v

在查看了该网站之后,我可能会重新编写我的语法规则以遵循该网站的规则,但其中一个问题是这个解析器还必须能够处理=、<、<=、>、>=、and、or、not。 - Dfranc3373
@Dfranc3373 请查看 http://en.cppreference.com/w/cpp/language/operator_precedence 获取完整的C++运算符优先级。 - TemplateRex
1
@Dfranc3373 太好了!顺便问一下,你是否已经阅读了FAQ http://stackoverflow.com/faq#howtoask,了解如何评分答案?你已经接受了每个问题的答案,这很好,但是你也可以对任何有用的答案进行评分。 - TemplateRex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接