编译原理中语法制导翻译(Syntax-Directed Translation, SDT)在中间代码生成阶段的核心机制,特别是基于属性文法和四元式生成的技术实现。其中通过引入语义变量(如 .place、.tc、.fc)与语义操作(如 GEN()、Backpatch() 等),将语法结构转化为中间表示形式。
例如,在赋值语句 A → id = E 中:
- 通过
Entry(id)获取标识符在符号表中的位置; - 利用
GEN('= ', E.place, '_', Entry(id))生成形如(=, t1, _, x)的四元式,表示将表达式结果t1赋值给变量x。
对于算术表达式 E → E₁ + E₂:
- 调用
t = Newtemp()创建新临时变量; - 执行
GEN('+', E₁.place, E₂.place, t)生成加法四元式; - 设置
E.place = t,供上层表达式引用该计算结果。
在布尔表达式和控制流语句(如 if、while)中,.tc 和 .fc 分别表示“真出口”和“假出口”的目标标号,配合 Backpatch() 实现跳转地址的回填,解决条件判断中的未定跳转问题。
这些技术共同构成了编译器前端从语法树到三地址码(如四元式)转换的基础流程。
# 模拟一个简单的四元式生成过程(简化版)
quadruples = [] # 四元式表
temp_counter = 0
symbol_table = {'a': 101, 'b': 102, 'c': 103} # 模拟符号表 Entry(id)
def Newtemp():
global temp_counter
temp_counter += 1
return f't{temp_counter}'
def GEN(op, arg1, arg2, result):
quadruples.append((op, arg1, arg2, result))
return len(quadruples) - 1 # 返回当前四元式地址
def Backpatch(instruction_list, target_label):
for i in instruction_list:
old_op, arg1, arg2, result = quadruples[i]
quadruples[i] = (old_op, arg1, arg2, target_label)
def Entry(id):
return symbol_table.get(id)
# 示例:翻译 a = b + c
E1_place = 'b'
E2_place = 'c'
t = Newtemp()
GEN('+', E1_place, E2_place, t) # (+, b, c, t1)
GEN('=', t, '_', 'a') # (=, t1, _, a)
print("生成的四元式:")
for i, quad in enumerate(quadruples):
print(f"({i}) {quad}")
输出:
生成的四元式:
(0) ('+', 'b', 'c', 't1')
(1) ('=', 't1', '_', 'a')


7266

被折叠的 条评论
为什么被折叠?



