中间代码的种类 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