如何用三地址码表示二进制逻辑

web*_*ner 1 compiler-construction parsing tacit-programming

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

例如

if x relop y goto L1, where relop is (!=,==,>,>=,<,<=)
Run Code Online (Sandbox Code Playgroud)

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

j = 0
while(j < 10 || j < 20)
{
    System.out.println(i);
    j++;
}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

ric*_*ici 5

您将其分为两个测试:

L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3:
Run Code Online (Sandbox Code Playgroud)

(你的意思是j < 10 || j > 20?正如所写,第一个测试是多余的。)

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

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