我可以通过野牛减少树木来优化哪个节点?

时间:2016-06-02 08:28:29

标签: compiler-construction bison

如果我创建一个编译器,其中bison的输出是树。我想通过减少常量表达式的树来优化该树。例如, 如果我有(if_else_node)我可以通过选中(expression_if == true)来缩小此节点,那么我就不需要访问(else_node)

另一个减少的例子:

如果我有(add_node)并且我有(7+9+2+6)这个词,我可以将其缩减为(add_node) (18 + 6)

我的问题是我可以在野牛树中减少另一个节点吗?

1 个答案:

答案 0 :(得分:0)

你的问题做出了错误的假设,即bison的输出是一个解析树。野牛解析器生成器工具仅构建解析器。它不会隐式地对成功的解析执行任何默认操作,例如构建解析树,尽管还有其他解析器生成器或编译器编译器工具集。

要让bison解析器构建一个解析树作为解析的结果,您必须专门提供自己的代码来执行此操作。

但是,如果您提供了这样的解析树构建器,则可以获得您描述的树节点,并且可以执行您描述的常量折叠。

您的问题不是关于野牛,而是关于如何在解析树中执行中间代码优化。编译器编写教科书时,编译器的这些阶段有很多描述。但是我可以帮助你识别更多的东西。

目前还不清楚您是否具体询问常量折叠优化,还是整个中间代码优化范围。

你提到了两个,布尔表达式的优化,它可以导致从条件中删除死代码。这些条件也可以在循环中发生,这也可以导致循环删除:

  • (expression_while == false)可以导致整个循环被移除。

您已经提到过(add_node),但当然可以在编译时计算所有整数算术运算符。

可以执行的另一种有用的优化形式是各种形式的算术常量操作。一些简单的例子:

  • (add_node)(x+0) => (x)
  • (multiply_node)(x*1) => (x)
  • (multiply_node)(x*0) => (0)

希望这就是你所寻求的?