1、第八章 中间代码生成学习内容m三地址码表示方法m声明语句的翻译m赋值语句的翻译:数组寻址m布尔表达式的翻译mcase语句的翻译mbackpatching技术的实现m过程调用的翻译8.1 中间语言8.1.1 图表示a := b * -c + b * -c语法树方式表示后缀表示 语法树的线性表示方式a b c uminus * b c uminus * + assign语法制导定义构造语法树PRODUCTION Semantic RuleS id := E S.nptr = mknode (assign,mkleaf(id, id.entry), E.nptr) E E1 + E2 E.nptr
2、= mknode(+, E1.nptr,E2.nptr) E E1 * E2 E.nptr = mknode(*, E1.nptr,E2.nptr) E - E1 E.nptr = mknode(uminus, E1.nptr) E ( E1 ) E.nptr = E1.nptr E id E.nptr = mkleaf(id, id.entry) 语法树的计算机内部表示8.1.2 三地址码m Three-Address Codem 一般形式: x := y op zm 语法树、 dag的线性化表示t1 := -c t1 := -ct2 := b * t1 t2 := b * t1t3 :=
3、-c t5 := t2 + t2t4 := b * t3 a := t5t5 := t2 + t4a := t58.1.3 三地址码语句类型1. 二元运算: x := y op z2. 一元运算: x := op y3. 复制语句: x := y4. 无条件转移: goto L5. 条件转移: if x relop y goto L6. 函数调用: param x1param x2param xncall p, n7. 数组: x := y i , x i := y8. 指针: x := E.code = E1.code | E2.code | | gen(E.place := E1.plac
4、e + E2.place) E E1 * E2 E.place= newtemp ;E.code = E1.code | E2.code | | gen(E.place := E1.place * E2.place) E - E1 E.place= newtemp ;E.code = E1.code | gen(E.place := uminus E1.place) E ( E1 ) E.place= E1.place ; E.code = E1.codeE id E.place = id.entry ; E.code = 控制流语句的翻译m while语句: S while E do S1m 翻译为 S.begin: E.codeif E.place = 0 goto S.afterS1.codegoto S.beginS.after:m 语法制导定义:S.begin = newlabel;S.after = newlabel ;S.code = gen(S.begin :) | E.code | gen(if E.place = 0 goto S.after) | S1.code | gen(goto S.begin) | gen(S.after :)