【问题标题】:Reassociation according to Muchnick根据 Muchnick 的重新关联
【发布时间】:2014-07-12 17:06:56
【问题描述】:

我正在阅读 Muchnick 的“Advanced Compiler Design & Implementation”,其中图 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 或类似的东西?

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

【问题讨论】:

    标签: optimization compiler-construction program-transformation


    【解决方案1】:

    我没有这本书,但我会试试看。起始表达式:

    ((c1 + t1) + t2) + c2
    

    应用 R2:

    c2 + ((c1 + t1) + t2)
    

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

    (c2 + (c1 + t1)) + t2
    

    递归。将 R7 应用于左侧子表达式。

    (c2 + c1) + t1
    

    递归。将 R1 应用于左侧子表达式:

    c2+c1
    

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

    【讨论】:

    • 嗯。现在我看不到我的问题了...谢谢:-)
    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 2021-03-24
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    相关资源
    最近更新 更多