【问题标题】:How to represent binary logical in Three Address Code如何在三地址码中表示二进制逻辑
【发布时间】:2018-12-14 12:25:38
【问题描述】:

在三个地址代码中,一个分支只能有一个二元关系运算符,

例如

if x relop y goto L1, where relop is (!=,==,>,>=,<,<=)

以下如何表示为三地址码格式:

j = 0
while(j < 10 || j < 20)
{
    System.out.println(i);
    j++;
}

这是我的解决方案,显然是不正确的:

main:
        j = 1
        sum = 0
L2:
        if j < 10 || j < 20 goto L3
        goto L4
L3:
        mt2 = sum + 1
        sum = mt2
        mt3 = j + 1
        j = mt3
        goto L2
L4:
        sum = 2

【问题讨论】:

  • 你需要在if指令前将j &lt; 10 || j &lt; 20分解成三个地址码,然后在里面测试结果是否为假。
  • 感谢您的回复!例如,你不能有这个,mt1 = j &lt; 10 因为x op y 其中 op 只能是 (+,-,\,*,&amp;&amp;, or ||) @Johan
  • @webchatowner 然后你可以使用jlt10 = true; if j &lt; 10 goto L1; jlt10 = false; L1:之类的东西来实现jlt10 = j &lt; 10

标签: parsing compiler-construction tacit-programming


【解决方案1】:

你把它分解成两个测试:

L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3:

(您的意思是j &lt; 10 || j &gt; 20?正如所写,第一个测试是多余的。)

一般来说,||&amp;&amp; 是控制流操作符,并转换为单独的分支指令。请注意,布尔值not 通常是通过翻转标签来实现的。

布尔运算符通常是“短路的”——也就是说,除非必要,否则不会计算右手操作——正是因为这种翻译风格。如果第二个计算更复杂,它会在第一个 if 之后完成,这会导致短路行为。

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 2012-11-27
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多