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

为此表达:

A - (B - c)

下面的AST:

   -
  / \
 A   -
    / \
   B   C

应正确生成先前的表达式,包括括号,但是,如果第二个操作员是加法操作员(例如),则括号将不必要。我希望仅在必要时使用它们来提高可读性。

是否有任何规则决定这种行为以及如何知道何时使用括号。加上和减,在大多数语言中具有相同的优先级,我想为所有运营商做这项工作。

有帮助吗?

解决方案

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

从非正式的角度来看,我认为基本想法是,当您重复进行子表达时,您将其优先级与当前表达式进行比较。如果较低,则需要括号。否则您不会。可以通过进行类似检查来处理关联性:如果子表达具有 相同的 优先级作为父括号,如果括号是根据关联的错误方面。

其他提示

如果树在树中的操作较低,则无需将其放入括号中。

不过要知道操作的优先级是不够的。您还需要知道 关联 操作。它允许正确分组同等优先级的操作。说,减法是关联的,所以 A-B-C 等于 (A-B)-C, ,但不 A-(B-C).

只需写下所有操作的优先级和关联表的表格,然后在产生表达式时进行咨询即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top