一条式子生成几条汇编
(每道题开头都有同一段:MNEMONIC 把运算符映射到助记符(+→ADD、-→SUB、*→MUL);select(t) 把一条 IR 选成几条汇编(二元运算 4 条、const/copy 各 2 条);gen(prog) 生成全部汇编行;count_instrs 数指令数、count_mne(prog, m) 数某助记符出现几次。)
把一条 t = a + b 选成汇编,数一数几条:
MNEMONIC = {"+": "ADD", "-": "SUB", "*": "MUL"}
def select(t):
"""把一条三地址码 (op, dst, a, b) 选成几条汇编:二元运算 4 条、const/copy 各 2 条。"""
op = t[0]
if op == "const":
return ["LOADI R0, " + str(t[2]), "STORE " + t[1] + ", R0"]
if op == "copy":
return ["LOAD R0, " + str(t[2]), "STORE " + t[1] + ", R0"]
m = MNEMONIC[op]
return ["LOAD R0, " + str(t[2]), "LOAD R1, " + str(t[3]), m + " R0, R1", "STORE " + t[1] + ", R0"]
def gen(prog):
"""把整个三地址码程序生成汇编,交回汇编行的列表。"""
out = []
for t in prog:
out += select(t)
return out
def count_instrs(prog):
"""一共生成了几条汇编指令。"""
return len(gen(prog))
def count_mne(prog, m):
"""生成的汇编里,助记符 m(如 "ADD")出现几次。"""
return sum(1 for line in gen(prog) if line.split()[0] == m)
print(len(select(("+", "t", "a", "b"))))
全部评论