传播后这个操作数变成几

👁️ 1 人浏览 💬 0 人评论 ❤️ 添加收藏

按模型,t1=const 7 后接 r=t1+1propagate 后第 2 条的第一个操作数是几?

贯穿本节的 IR 模型(判题机没 gcc,这是它的确定模型):程序是三地址码元组列表,每条 (dst, op, a, b)——opconst/copy/+/-/*,操作数 a/b 是整数(常量)或字符串(变量名)。

常量折叠 fold:两个操作数都是常量的运算,直接算成 const;常量传播 propagate:操作数是已知常量的变量就换成值;count_const 数 const 指令。

def is_num(x):
    """操作数是不是常量(整数)。"""
    return isinstance(x, int)


def fold1(op, a, b):
    """两个常量做一次运算,交回结果。"""
    return {"+": a + b, "-": a - b, "*": a * b}[op]


def fold(prog):
    """常量折叠:两个操作数都是常量的运算,直接算成 const。"""
    out = []
    for (dst, op, a, b) in prog:
        if op in ("+", "-", "*") and is_num(a) and is_num(b):
            out.append((dst, "const", fold1(op, a, b), None))
        else:
            out.append((dst, op, a, b))
    return out


def consts(prog):
    """扫一遍,收集已知是常量的变量:名 -> 值。"""
    env = {}
    for (dst, op, a, b) in prog:
        if op == "const":
            env[dst] = a
    return env


def propagate(prog):
    """常量传播:操作数是已知常量的变量,就换成它的值。"""
    env = consts(prog)
    out = []
    for (dst, op, a, b) in prog:
        na = env[a] if isinstance(a, str) and a in env else a
        nb = env[b] if isinstance(b, str) and b in env else b
        out.append((dst, op, na, nb))
    return out


def count_const(prog):
    """程序里有几条 const 指令。"""
    return sum(1 for ins in prog if ins[1] == "const")

print(propagate([("t1", "const", 7, None), ("r", "+", "t1", 1)])[1][2])
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论