Parsing 如何用三地址码表示二进制逻辑
在三地址代码中,分支只能有一个二进制关系运算符 e、 gParsing 如何用三地址码表示二进制逻辑,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
如果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: