编译原理 第五章语法制导翻译和中间 代码生成 上海交通大学 张冬茉 Email:Zhang-dm@cssjtu.edu.cn 2004年4月
1 编译原理 第五章 语法制导翻译和中间 代码生成 上海交通大学 张冬茉 Email:zhang-dm@cs.sjtu.edu.cn 2004年4月
本章目的 经过词法分析、语法分析后,源程 序在静态结构上的正确性得到了保证, 编译程序接着需作静态语义检查以及翻 译,真正实现不同程序语言的代码间的 等价变换
2 本章目的 经过词法分析、语法分析后,源程 序在静态结构上的正确性得到了保证, 编译程序接着需作静态语义检查以及翻 译,真正实现不同程序语言的代码间的 等价变换
第五章语法制导翻译称 中间代码生成 s5.1翻译概述 静态语义检查 如同词法分析,语法分析同时进行着词法检查、语法 检査一样。在语义分析时,必然要进行语义检查。动 态语义检查需要生成相应的目标代码,在运行时刻进 行,静态语义检查在编译时完成它,则涉及: 3
3 第五章 语法制导翻译和 中间代码生成 §5.1翻译概述 一、静态语义检查 如同词法分析,语法分析同时进行着词法检查、语法 检查一样。在语义分析时,必然要进行语义检查。动 态语义检查需要生成相应的目标代码,在运行时刻进 行,静态语义检查在编译时完成它,则涉及:
(1)类型检查,如参数运算的操作数的类型应相容 (2)控制流检查,以保证控制语句有合法的转向点, 如C语言中的 break语句,需寻找包含它的最小的 switch、whil或for语句,方可找到转向点,否则 出错。 (3)有关名字的匹配检查。可以对某些程序段命名, 该名字出现在程序段的开始和结束处,如同语句括 号一般,应检查它们的配对。 (4)一致性检查,如在相同作用域中标识符只能说 明一次,case语句的标号不能相同,枚举类型的元 素不能重复等。 4
4 (1) 类型检查,如参数运算的操作数的类型应相容。 (2) 控制流检查,以保证控制语句有合法的转向点, 如C语言中的break语句,需寻找包含它的最小的 switch、while或for语句,方可找到转向点,否则 出错。 (3) 有关名字的匹配检查。可以对某些程序段命名, 该名字出现在程序段的开始和结束处,如同语句括 号一般,应检查它们的配对。 (4) 一致性检查,如在相同作用域中标识符只能说 明一次,case语句的标号不能相同,枚举类型的元 素不能重复等
、语法制导翻译的例子。 讨论翻译前,先看一个例子: 图5.1展示了文法(4.2)的一个翻译方案 E→→E+T{ print“1”} E→→T{ print“2”} T→TF{ print“3”} T→F{ print“4”} F→→(E){ print“5”} { print“6”} 图51文法(42)的一个翻译方案 其实是在文法(42)的每个产生式后配了一个由{}扩起 来的语义子程序,不难证明终结符串(id+id)*id是文 法(4.2)的一个合法句子,它的分析树如图52所示:
5 二、语法制导翻译的例子。 讨论翻译前,先看一个例子: 图5.1 展示了文法(4.2)的一个翻译方案 E→E+T {print “1”} E→T {print “2”} T→T*F {print “3”} T→F {print “4”} F→(E) {print “5”} F→I {print “6”} 图5.1 文法(4.2)的一个翻译方案 其实是在文法(4.2)的每个产生式后配了一个由{ }扩起 来的语义子程序,不难证明终结符串(id+id)*id 是文 法(4.2)的一个合法句子,它的分析树如图5.2所示: