生成C / C ++代码时表达式的相关性和优先级?

时间:2010-11-29 18:13:38

标签: compiler-construction programming-languages code-generation abstract-syntax-tree semantic-analysis

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

对于这个表达式:

A - (B - c)

下面的AST:

   -
  / \
 A   -
    / \
   B   C

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

是否存在规定此类行为的规则以及如何知道何时使用括号。在大多数语言中,加号和减号具有相同的优先级,我希望这对所有运营商都有效。

2 个答案:

答案 0 :(得分:4)

从历史上看,他们称之为“漂亮印刷”。如果谷歌加上“优先级”,你可能会找到一些例子来帮助你。

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

答案 1 :(得分:2)

如果树中优先级较高的操作较低,则不需要将其括在括号中。

虽然知道操作的优先级是不够的。您还需要了解操作的associativity。它允许正确地对相同优先级的操作进行分组。比方说,减法是关联的,因此A-B-C等于(A-B)-C,但不等于A-(B-C)

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