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

Parsing 如何用三地址码表示二进制逻辑,parsing,compiler-construction,tacit-programming,Parsing,Compiler Construction,Tacit Programming,在三地址代码中,分支只能有一个二进制关系运算符 e、 g 如果x relop y转到L1,其中relop是(!=,=,>,>=,您将其分解为两个测试: L2: if j < 10 goto L3 if j < 20 goto L3 goto L4 L3: L2: 如果j

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

e、 g


如果x relop y转到L1,其中relop是(!=,=,>,>=,您将其分解为两个测试:

L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3:
L2:
如果j<10转到L3
如果j<20转到L3
转到L4
L3:
(你的意思是
j<10|j>20
?如前所述,第一个测试是多余的。)

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


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

您将其分解为两个测试:

L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3:
L2:
如果j<10转到L3
如果j<20转到L3
转到L4
L3:
(你的意思是
j<10|j>20
?如前所述,第一个测试是多余的。)

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


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

您需要将
j<10|j<20
分解为三个地址在if指令之前执行de,然后测试其中的结果是否为假。感谢您的回复!您不能使用此示例,
mt1=j<10
,因为
x op y
其中op只能是
(+,-,\,*,&&&,或| |)
@Johan@webchatowner然后您可以使用类似于
jlt10=true;if j<10转到L1;jlt10=false;L1:
的方法来实现
jlt10=j<10
。您需要在if指令之前将
j<10 | | j<20
分解为三个地址代码,然后测试其中的结果是否为false。谢谢您的回复!您不能拥有例如,
mt1=j<10
,因为
x op y
其中op只能是
(+,-,\,*,&&,或| |
@Johan@webchatowner然后您可以使用类似于
jlt10=true;if j<10转到L1;jlt10=false;L1:
的方法来实现
jlt10=j<10
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
L2:
        if j < 10 goto L3
        if j < 20 goto L3
        goto L4
L3: