zhouqijie

表达式的翻译




表达式中的运算

示例:
|产生式|语义规则| |-|-| |$S -> id = E ;$|S.code = E.code \|\| gen(top.get(id.lexeme) '=' E.addr)| |$E -> E_1 + E_2$|E.addr = new Temp() E.code = E1.code \|\| E2.code \|\| gen(E.addr '=' E1.addr '+' E2.addr)| |$E -> - E1$|E.addr = new Temp() E.code = E1.code \|\| gen(E.addr '=' 'minus' E1.addr)| |$E -> ( E1 )$|E.addr = E1.addr E.code = E1.code| |$E -> id$|E.addr = top.get(id.lexeme) E.code = ''|

code:三地址代码。
addr:存放值的地址。
top:当前符号表。
top.get:返回对应的符号表条目。
new Temp():产生新的临时变量t1、t2…
gen():生成三地址代码。




增量翻译

上面的语法制导定义是非增量翻译的。在增量方式中,gen不仅要构造出一个新的三地址指令,还要将它添加到至今为止已生成的指令序列之后。

使用增量方式后,不再需要code属性。



数组相关

(详见《编译原理p245-p247》)

(END)