如果我创建一个编译器,其中bison的输出是树。我想通过减少常量表达式的树来优化该树。例如,
如果我有(if_else_node)
我可以通过选中(expression_if == true)
来缩小此节点,那么我就不需要访问(else_node)
。
另一个减少的例子:
如果我有(add_node)
并且我有(7+9+2+6)
这个词,我可以将其缩减为(add_node) (18 + 6)
。
我的问题是我可以在野牛树中减少另一个节点吗?
答案 0 :(得分:0)
你的问题做出了错误的假设,即bison的输出是一个解析树。野牛解析器生成器工具仅构建解析器。它不会隐式地对成功的解析执行任何默认操作,例如构建解析树,尽管还有其他解析器生成器或编译器编译器工具集。
要让bison解析器构建一个解析树作为解析的结果,您必须专门提供自己的代码来执行此操作。
但是,如果您提供了这样的解析树构建器,则可以获得您描述的树节点,并且可以执行您描述的常量折叠。
您的问题不是关于野牛,而是关于如何在解析树中执行中间代码优化。编译器编写教科书时,编译器的这些阶段有很多描述。但是我可以帮助你识别更多的东西。
目前还不清楚您是否具体询问常量折叠优化,还是整个中间代码优化范围。
你提到了两个,布尔表达式的优化,它可以导致从条件中删除死代码。这些条件也可以在循环中发生,这也可以导致循环删除:
(expression_while == false)
可以导致整个循环被移除。您已经提到过(add_node),但当然可以在编译时计算所有整数算术运算符。
可以执行的另一种有用的优化形式是各种形式的算术常量操作。一些简单的例子:
(add_node)(x+0)
=> (x)
(multiply_node)(x*1)
=> (x)
(multiply_node)(x*0)
=> (0)
希望这就是你所寻求的?