Optimization 根据Muchnick重新关联

Optimization 根据Muchnick重新关联,optimization,compiler-construction,program-transformation,Optimization,Compiler Construction,Program Transformation,我正在阅读Muchnick的“高级编译器设计与实现”,图12.6列出了20条转换规则,如果按顺序应用,这些规则会进行常量折叠和重新关联,以将常量移动到一起。规则(不包括分布式规则)是(我的语法:c是文字,t术语,带空格的运算符在源代码中,而不带空格的运算符表示涉及文字的编译时计算): R1:c1+c2=c1+c2 R3:c1*c2=c1*c2 R5:c1-c2=c1-c2 R2:t+c=c+t R4:t*c=c*t R6:t-c=(-c)+t R7:t1+(t2+t3)=(t1+t2)+t3 R

我正在阅读Muchnick的“高级编译器设计与实现”,图12.6列出了20条转换规则,如果按顺序应用,这些规则会进行常量折叠和重新关联,以将常量移动到一起。规则(不包括分布式规则)是(我的语法:
c
是文字,
t
术语,带空格的运算符在源代码中,而不带空格的运算符表示涉及文字的编译时计算):

R1:c1+c2=c1+c2 R3:c1*c2=c1*c2 R5:c1-c2=c1-c2 R2:t+c=c+t R4:t*c=c*t R6:t-c=(-c)+t R7:t1+(t2+t3)=(t1+t2)+t3 R8:t1*(t2*t3)=(t1*t2)*t3 R9:(c1+t)+c2=(c1+c2)+t R10:(c1*t)*c2=(c1*c2)*t 他写道“按照给定的顺序递归地应用树转换规则[…],但我看不出这是如何实现的。给定
((c1+t1)+t2)+c2
,我将如何应用规则来获得
(c1+c2+t1)+t2
或类似的结果


(我可以想出一套不同的规则,但我想了解书中的内容,以防我看错了)。

我没有这本书,但我会尝试一下。开始表达:

((c1 + t1) + t2) + c2
c2+c1
应用R2:

c2 + ((c1 + t1) + t2)
对右侧的子表达式递归应用规则不会产生任何匹配项。继续对整个表达式应用R7(文字也是术语):

递归。在左边的子表达式上应用R7

(c2 + c1) + t1
递归。在左边的子表达式上应用R1:

((c1 + t1) + t2) + c2
c2+c1
最终结果:
(c2+c1+t1)+t2

嗯。现在我看不出我的问题了……谢谢:-)