【问题标题】:Unary And Binary Minus in Parse Tree解析树中的一元和二元减号
【发布时间】:2026-01-26 15:35:01
【问题描述】:

我正在创建一个包含类似于

的表达式的解析树

3 - 4 * 8

8 * -5

-(10 * 1)

我需要一种方法来区分一元减号和二元减号。我的语法现在的方式是首先达到二进制减号,但我正在考虑更改它并添加一个包含最后一个变量的标志变量。

例如:如果是5 - 6

标志是 5,如果它看到减号并且标志是一个数字,则跳过一元并转到二进制。

但是我不确定如何在 C++ 中实现这一点

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您是指在解析时区分它们的方法,还是在解析树中区分它们的方法?在解析树中,这很简单——只有单独的 UNARY_MINUSBINARY_MINUS 运算符。如果您的意思是在解析时,当您期望操作数而不是运算符时会出现一元减号。
  • 在我的解析器中,我希望它能够区分 -5 和 4 -5。我的下一部分将这棵树的叶子转换为 AST 树(正在工作),但我的解析器将所有内容视为二进制减号 (4 - 5)。

标签: c++ operator-precedence unary-operator parse-tree binary-operators


【解决方案1】:

实现解析器最简单的方法是使用Recursive Descent 方法。确保二进制减号的优先级高于一元减号,就像在引用的站点中一样:

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

【讨论】:

  • 查看该站点后,我可能会重新编写语法规则以遵循该站点的规则,但其中一个问题是该解析器还必须能够处理 = 、 , >=, and, or, not
  • @Dfranc3373 请参阅 en.cppreference.com/w/cpp/language/operator_precedence 了解 C++ 的完整运算符优先级
  • @Dfranc3373 太好了!顺便说一句,您是否已经阅读了关于如何评分答案的常见问题解答*.com/faq#howtoask?您已经接受了您提出的每个问题的答案,这很好,但您也可以为任何您认为有用的答案打分。
最近更新 更多