语法制导生成三元式 产生式 语义动作 E→E()opE(2) RE. VAL= TRIP(op, EO).VAL, E().VAL)) E→→(E() E·VAL=E()·VAL} E→→一E(1) E·WAL=TRIP@,E()VAL,)}@代表一元负运算 E→id E·VAL= ENTRY(id)}
11 语法制导生成三元式 产生式 语义动作 E→E(1) op E(2) {E ·VAL= TRIP(op, E(1) ·VAL , E(2) ·VAL) } E→(E(1)) {E · VAL = E(1) · VAL } E→-E (1) {E ·VAL= TRIP(@ , E(1) ·VAL , _)} @代表一元负运算 E →id {E · VAL = ENTRY(id)}
实现 ENTRY(i) 定义两个语义函数 LOOKUP(NAME) 对NAME查符号表若此名出现在表中, 则将其表项位置作为 LOOKUP的值; 否则, LOOKUP为空 FILLSYMNAME 在符号表中开辟一新项项名 为NAME把此项的入口作为 FILLSYM的值 12
12 实现ENTRY(i) ▪ 定义两个语义函数 LOOKUP(NAME): 对NAME查符号表.若此名出现在表中, 则将其表项位置作为LOOKUP的值; 否则,LOOKUP为空. FILLSYM(NAME): 在符号表中开辟一新项,项名 为NAME,把此项的入口作为FILLSYM的值
ENTRY定义为: FUNCTION ENTRY(NAME) BEGIN ENTRY: LOOKUP(NAME) IF ENTRY NULL THEN ERROR ENTRY: - FILLSYMNAME)I END 13
13 ▪ ENTRY定义为: FUNCTION ENTRY(NAME) BEGIN ENTRY:=LOOKUP(NAME); IF ENTRY=NULL THEN ERROR [ENTRY:=FILLSYM(NAME)] END
2、间接三元式去除重复三元式,便于优化 用一张间接码表辅以三元式表来表示中间代码 间接码表按运算的先后顺序列出有关的三元式 在三元式表中的位置
14 2、间接三元式 去除重复三元式,便于优化 用一张间接码表辅以三元式表来表示中间代码. 间接码表按运算的先后顺序列出有关的三元式 在三元式表中的位置
例:x:=(a+b) 间接三元式 y: d *(a+b op ARGI AGR2 般三元式 (1)+a 、9DARG1ARG2 a (2) (4)*d(1 (3) (2) (5) (4)+a b 间接码表 (5) )(2)(3)(1)(4)5) (6) (5) 15
15 例: x:=(a+b)*c y:=d*(a+b) 一般三元式: op ARG1 ARG2 (1) + a b (2) * (1) c (3) := x (2) (4) + a b (5) * d (4) (6) := y (5) 间接三元式 op ARG1 AGR2 (1) + a b (2) * (1) c (3) := x (2) (4) * d (1) (5) := y (4) 间接码表 (1)(2)(3)(1)(4)(5)