如何用三地址码表示二进制逻辑
How to represent binary logical in Three Address Code
在三个地址码中一个分支只能有一个二元关系运算符,
例如
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
你把它分解成两个测试:
L2:
if j < 10 goto L3
if j < 20 goto L3
goto L4
L3:
(您是说 j < 10 || j > 20
吗?正如所写,第一个测试是多余的。)
一般来说,||
和 &&
是控制流运算符,并转换为单独的分支指令。注意,boolean not
通常是通过翻转标签实现的。
布尔运算符通常是 "short-circuiting"——也就是说,除非必要,否则不评估右侧的操作——正是因为这种翻译风格。如果第二次计算更复杂,它会在第一次 if
之后完成,这会导致短路行为。
在三个地址码中一个分支只能有一个二元关系运算符,
例如
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
你把它分解成两个测试:
L2:
if j < 10 goto L3
if j < 20 goto L3
goto L4
L3:
(您是说 j < 10 || j > 20
吗?正如所写,第一个测试是多余的。)
一般来说,||
和 &&
是控制流运算符,并转换为单独的分支指令。注意,boolean not
通常是通过翻转标签实现的。
布尔运算符通常是 "short-circuiting"——也就是说,除非必要,否则不评估右侧的操作——正是因为这种翻译风格。如果第二次计算更复杂,它会在第一次 if
之后完成,这会导致短路行为。