3

我编写了一个生成 AST 的基本编译器,正确考虑了表达式中的运算符优先级。但是,在执行代码生成以生成 C++ 代码时,我不确定如何处理括号的使用。

对于这个表达式:

A - (B - c)

下面的AST:

   -
  / \
 A   -
    / \
   B   C

应该正确生成包含括号的前一个表达式,但是如果第二个运算符是加法运算符(例如),则括号将是不必要的。我宁愿只在必要时使用它们以提高可读性。

是否有任何规则规定这种行为以及如何知道何时使用括号。加号和减号在大多数语言中具有相同的优先级,我想让所有运算符都可以使用。

4

2 回答 2

4

从历史上看,他们称之为“漂亮的印刷”。如果您在 Google 上加上“优先级”,您可能会找到一些可以帮助您的示例。

非正式地,我认为基本思想是,当您递归到子表达式时,您将其优先级与当前表达式进行比较。如果它较低,则需要括号。否则你不会。可以通过进行类似的检查来处理关联性:如果子表达式与父表达式具有相同的优先级,则根据关联性,如果它位于错误的一侧,则需要括号。

于 2010-11-30T22:28:31.780 回答
2

如果具有较高优先级的操作在树中较低,则无需将其放入括号中。

但是,仅仅知道操作的优先级是不够的。您还需要知道操作的关联性。它允许正确地对同等优先级的操作进行分组。比如说,减法是左结合的,所以A-B-C等于(A-B)-C,但不等于A-(B-C)

只需为所有操作写下整个优先级和关联性表,并在生成表达式时查阅它。

于 2010-11-29T20:10:16.283 回答