如何在三地址代码中表示二进制逻辑

时间:2018-12-14 12:25:38

标签: parsing compiler-construction tacit-programming

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

例如

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

1 个答案:

答案 0 :(得分:4)

您将其分为两个测试:

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

(您是说j < 10 || j > 20吗?按照书面说明,第一个测试是多余的。)

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

布尔运算符通常是“短路”的-也就是说,除非有必要,否则不对右手运算进行评估-正是因为这种转换方式。如果第二个计算更加复杂,则它会在第一个if之后执行,这会导致短路行为。