我编写了一个生成AST的基本编译器,正确地考虑了表达式中的运算符优先级。但是,在执行代码生成以生成C ++代码时,我不确定如何处理括号的使用。
对于这个表达式:
A - (B - c)
下面的AST:
-
/ \
A -
/ \
B C
应该正确生成包含括号的前一个表达式,但是如果第二个运算符是加法运算符(例如),则括号将是不必要的。我宁愿只在必要时使用它们来提高可读性。
是否存在规定此类行为的规则以及如何知道何时使用括号。在大多数语言中,加号和减号具有相同的优先级,我希望这对所有运营商都有效。
答案 0 :(得分:4)
从历史上看,他们称之为“漂亮印刷”。如果谷歌加上“优先级”,你可能会找到一些例子来帮助你。
非正式地说,我认为基本思想是当你递归到子表达式时,你将它的优先级与当前表达式进行比较。如果它更低,你需要括号。否则你不会。可以通过执行类似检查来处理关联性:如果子表达式与父级具有相同的优先级,则根据关联性,如果它在错误的一侧则需要括号。
答案 1 :(得分:2)
如果树中优先级较高的操作较低,则不需要将其括在括号中。
虽然知道操作的优先级是不够的。您还需要了解操作的associativity。它允许正确地对相同优先级的操作进行分组。比方说,减法是关联的,因此A-B-C
等于(A-B)-C
,但不等于A-(B-C)
。
只需记下所有操作的整个优先级和关联性表,并在生成表达式时查阅它。