三地址代码 (TAC) 和合取/析取

问题描述 投票:0回答:1

我想将连词(与析取词相同)翻译为 TAC。

int a;
int b;

bool c = a > 1 && b < 5;

帖子如何用三地址代码表示二进制逻辑回答了我问题的前半部分。但它没有回答如何处理结果。我的解决方案如下:

    if a <= 1 goto L1
    _t1 = b < 5
    goto L2
L1: _t1 = 0
L2: c = _t1

问题是,我读到(因为后来的优化问题),临时对象应仅限于基本块。 我的解决方案将违反此规则。

这是一个问题吗? 如何创建 TAC 而不发生此违规?

注: 我想独立处理 AST 分支。 因此,结果分配是在逻辑运算之后处理的,因此直接将结果分配给

c
是不可行的。

非常感谢。

compiler-construction intermediate-language tac
1个回答
0
投票

是否可以在条件之外使用逻辑运算符? 如果是,那么你可以这样做:

_t0 = b < 5
_t1 = a > 1
c = _t0 & _t1

否则,如果不允许在条件之外使用逻辑运算符:

    if a <= 1 goto False
    if b > 5 goto False
    c = 1
    goto True
False:
    c = 0
True:
© www.soinside.com 2019 - 2024. All rights reserved.