编译原理与技术 中间代码生成 2021/2/11 《编译原理与技术》讲义
2021/2/11 《编译原理与技术》讲义 1 编译原理与技术 中间代码生成
中间代码生成 中间代码形式 控制流语句翻译 2021/2/11 《编译原理与技术》讲义
2021/2/11 《编译原理与技术》讲义 2 中间代码生成 -中间代码形式 -控制流语句翻译
中间代码生成 中间代码的种类 后缀式(逆波兰式) e.g. 1 a+b*-c, abc@+ eg21)a:=b*-C+b*-C,其后缀式为 abc@*@*+ assign 2) if a>b then c: =c+ 1 ab>cc1+ assign正 语法树Vs.分析树 eg.31)a:=b*-C+b*-C,其语法树为 2021/2/11 《编译原理与技术》讲义 3
2021/2/11 《编译原理与技术》讲义 3 中间代码生成 中间代码的种类 - 后缀式(逆波兰式) e.g.1 a + b * -c ➔ a b c @ * + e.g.2 1)a := b* -c + b * -c,其后缀式为 a b c @ * b c @ * + assign 2)if a>b then c := c + 1 a b > c c 1 + assign IF - 语法树 vs. 分析树 e.g.3 1)a := b* -c + b * -c,其语法树为
中间代码的种类 -e.g.3 1)a: =b*-C+ b*-c 语法树 VS.分析树 赋值语句 assign E assign E a a E E E × E b@ E b @E 2021/2/11 《编译原理与技术》讲义 4
2021/2/11 《编译原理与技术》讲义 4 - e.g.3 1)a := b* -c + b * -c 语法树 vs. 分析树 中间代码的种类 assign a + * b @ c * b @ c assign E E + E E * E b @ E E a 赋值语句 c E * E b @ E c
中间代码的种类 -e.g.3 2)a: =b*-C+ b*-c 语法树 VS DAG assign assign a a b@ 2021/2/11 《编译原理与技术》讲义 5
2021/2/11 《编译原理与技术》讲义 5 - e.g.3 2)a := b* -c + b * -c 语法树 vs. DAG 中间代码的种类 assign a + * b @ c * b @ c assign a + * b @ c
中间代码的种类 neg4构造表达式的语法树(DAG) 产生式 语义规则 E>E1+ E2 Enptr: = mknode(+, E1nptr, E2 npt E>E1-E2 Enptr: = mknode (-, E1 nptr, E2nptr) E→>E1*E2 E nptr:= mknode(”,E1nptr,E2nptr) E→>E1/E2 E nptr:= mknode(’,E1nptr,E2npt E>E1 Enptr: E1nptr E→>-E1 Enptr: =mknode (@,, E,nptr, -) E>number Enptr = mkleaf(NUM, number. lex val) E→>id E nptr: =mkleat('ID, d entry)2 Cy 2021/2/11 《编译原理与技术》讲义 6
2021/2/11 《编译原理与技术》讲义 6 中间代码的种类 e.g.4 构造表达式的语法树(DAG) 产生式 语义规则 E→E1 + E2 E.nptr := mknode(‘+’,E1 .nptr, E2 .nptr) E→E1 - E2 E.nptr := mknode(‘-’,E1 .nptr, E2 .nptr) E→E1 * E2 E.nptr := mknode(‘*’,E1 .nptr, E2 .nptr) E→E1 / E2 E.nptr := mknode(‘/’,E1 .nptr, E2 .nptr) E→( E1 ) E.nptr := E1 .nptr E→ - E1 E.nptr := mknode(‘@’,E1 .nptr, -) E→number E.nptr := mkleaf(‘NUM’,number.lex_val) E→id E.nptr := mkleaf(‘ID’,id.entry)
中间代码的种类 neg4构造表达式的语法树(DAG) Enpr-E的语法树(根结点指针) mknode(op,lef,rght)一建立一个表达式语法 树结点,它的运算符为op,左、右运算对象 是eft和rght所指的语法树。 mkleaf(NUM, number. lex val) mkleaf(ID, id entry 建立表达式语法树的叶子结点 2021/2/11 《编译原理与技术》讲义 7
2021/2/11 《编译原理与技术》讲义 7 中间代码的种类 e.g.4 构造表达式的语法树(DAG) E.nptr - E的语法树(根结点指针) mknode(op, left, right)-建立一个表达式语法 树结点,它的运算符为op,左、右运算对象 是left和right所指的语法树。 mkleaf(‘NUM’,number.lex_val)- mkleaf(‘ID’,id.entry)- 建立表达式语法树的叶子结点
中间代码的种类 neg4构造表达式a+b*4的语法树(DAG) 十 iD a iD b @ NUM4 2021/2/11 《编译原理与技术》讲义 8
2021/2/11 《编译原理与技术》讲义 8 e.g.4 构造表达式a+b*-4的语法树(DAG) 中间代码的种类 + ID a * ID b @ NUM 4
中间代码的种类 三地址代码 般形式:ⅹ:=yopz 或X:=opy eg5a:=b-C+b*-C的三地址代码 1)t 2)t2:=b*t 2)t2:=b*t1 3)t2:=-C 3’)t 十 4)t4:=b*t3 4)a:=t 5)t5:=t2+t4 6)a:=t5 2021/2/11 《编译原理与技术》讲义 9
2021/2/11 《编译原理与技术》讲义 9 中间代码的种类 三地址代码 一般形式:x := y op z 或 x := op y e.g.5 a := b* -c + b * -c的三地址代码 1)t1 := - c 1’) t1 := - c 2)t2 := b * t1 2’) t2 := b * t1 3)t3 := - c 3’) t3 := t2 + t2 4)t4 := b * t3 4’) a := t3 5)t5 := t2 + t4 6)a := t5
中间代码的种类 常用的三地址代码 x:=yopz二元运算 x:=0py单目运算 X:=y 值拷贝 goto L 无条件转移到代码标号L处 f X RELoP y goto L条件转移代码:若x和y满 足 RELOP关系,则转移至代码标号L处 param X 参数X CALL proc,N调用过程proc,参数个数为N 2021/2/11 《编译原理与技术》讲义 10
2021/2/11 《编译原理与技术》讲义 10 中间代码的种类 常用的三地址代码 - x := y op z 二元运算 - x := op y 单目运算 - x := y 值拷贝 - goto L 无条件转移到代码标号L处 - if x RELOP y goto L 条件转移代码:若x和y满 足RELOP关系,则转移至代码标号L处 - param X 参数X - CALL proc,N 调用过程proc,参数个数为N