1.1k likes | 1.16k Views
编译原理和技术. 课 程 简 介. 课程内容 介绍编译器构造的一般原理和基本实现方法 介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等 强调形式描述技术和自动生成技术 强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语言或目标机器. 课 程 简 介. 学习的意义 对编程语言的设计和实现有深刻的理解,对和编程语言有关的理论有所了解,对宏观上把握编程语言来说,起一个奠基的作用。 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。
E N D
课 程 简 介 课程内容 • 介绍编译器构造的一般原理和基本实现方法 • 介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等 • 强调形式描述技术和自动生成技术 • 强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语言或目标机器
课 程 简 介 学习的意义 • 对编程语言的设计和实现有深刻的理解,对和编程语言有关的理论有所了解,对宏观上把握编程语言来说,起一个奠基的作用。 • 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。 • 大多数程序员同时是简单语言的设计者,有助于提高对这些语言的设计水平。 • 在软件逆向工程、程序理解和软件安全等方面有着广泛的应用。
课 程 简 介 教材和参考书 • 陈意云、张昱,编译原理,高等教育出版社, 2003 • A. Aho, R. Sethi, and J. D. Ullman, Compilers: Principles, Techniques, and Tools , 2nd edition, Addison-Wesley, 1986 • 陈意云、张昱,编译原理习题精选与解析,高等教育出版社,2005 • 教学资源网页:http://staff.ustc.edu.cn/~yiyun
第一章 引 论 • 翻译器、编译器、解释器 • 编译器从逻辑上可以分成若干阶段 • 每个阶段把源程序从一种表示变换成另一种表示 • 通过描述编译器的各个阶段来介绍编译这个课题
源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
position := initial + rate * 60 符 号 表 . . . 1 position . . . 2 initial . . . 词法分析器 3 rate id1 := id2 + id3* 60 第一章 引 论
表达式 表达式 表达式 + 表达式 表达式 标识符 * (initial) 标识符 (rate) 数 (60) 第一章 引 论 表达式的语法特征 • 任何一个标识符都是表达式; • 任何一个数都是表达式; • 如果e1和e2都是表达式,那么 e1 + e2 e1*e2 (e1) 也都是表达式
id1 := id2 + id3* 60 符 号 表 . . . 1 position 语法分析器 . . . 2 initial . . . 3 rate := id1 + id2 * id3 60 第一章 引 论
符 号 表 . . . 1 position . . . 2 initial 语义分析器 . . . 3 rate := := id1 + id1 + id2 * id2 * id3 60 id3 inttoreal 60 第一章 引 论
前三个阶段完成对源程序的分析 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
符 号 表 . . . 1 position . . . 2 initial 中间代码生成器 . . . 3 rate := id1 temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 + id2 * id3 inttoreal 60 第一章 引 论
temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 符 号 表 . . . 1 position . . . 2 initial . . . 3 rate 代码优化器 temp1 := id3 * 60.0 id1 := id2 + temp1 第一章 引 论
符 号 表 . . . 1 position 代码生成器 . . . 2 initial . . . 3 rate MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 第一章 引 论 temp1 := id3 * 60.0 id1 := id2 * temp1
源程序 后三个阶段对源程序进行综合 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
源程序 解释器和编译器的区别 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
第一章 引 论 • BASIC语言年代解释器 • 功能:它将高级语言的源程序翻译成一种中间语言程序,然后对中间语言程序进行解释执行 • 在那个年代,编译和解释两个功能是合在一个程序中,该程序被称为解释器 • Java语言年代解释器 • 解释器的上述两个功能分在两个程序中 • 前一个编译器,它把源程序翻译成一种叫做字节码的中间语言程序 • 后一个叫做解释器,它对字节码程序进行解释执行
阶段分组 • 前端 • 后端 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
阶段分组 • 遍 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论
记号 词法分析器 语法分析器 源程序 取下一个记号 符号表 第二章 词法分析 • 本章内容 • 词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务 • 围绕词法分析器的自动生成展开 • 介绍正规式、状态转换图和有限自动机概念
2.1 词法记号及属性 2.1.1 词法记号、模式、词法单元 词法记号词法单元例举模式的非形式描述 var var var for for for relation < , < = , = , … < 或<= 或= 或 … id sum, count, D5 由字母开头的字母数字串 num 3.1, 10, 2.8 E12 任何数值常数 literal “seg. error” 引号“和”之间的任意字符 串,但引号本身除外
2.1 词法记号及属性 • 历史上词法定义中的一些问题 • 忽略空格带来的困难 DO 8 I 3. 75 DO8I 3. 75 DO 8 I 3, 75 • 关键字是否保留 IF THEN THEN THEN=ELSE;ELSE … • 关键字、保留字和标准标识符的区别
2.1 词法记号及属性 2.1.2 词法记号的属性 position := initial + rate * 60的记号和属性值: id,指向符号表中position条目的指针 assign _ op, id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60
2.1 词法记号及属性 2.1.3 词法错误 • 词法分析器对源程序采取非常局部的观点 • 难以发现下面的错误 fi (a == f (x) )… • 在实数是a.b格式下,可以发现下面的错误 123. • 紧急方式的错误恢复 • 错误修补
2.2 词法记号的描述与识别 2.2.1 串和语言 • 字母表:符号的有限集合, 例: = {0, 1} • 串:符号的有穷序列,例:0110, • 语言:字母表上的一个串集 {, 0, 00, 000, …}, {}, • 句子:属于语言的串 • 串的运算 • 连接 xy,s= s = s • 积(指数) s0为,si为si -1s(i > 0)
2.2 词法记号的描述与识别 • 语言的运算 • 和:L M = {s | sL 或 s M } • 连接:LM = {st | s L 且 t M} • 指数:L0是{},Li是Li -1L • 闭包:L = L0 L1 L2 … • 正闭包: L+ = L1 L2 … • 例 L: { A, B, …, Z, a, b, …, z }, D: { 0, 1, …, 9 } L D, LD, L6, L*, L(L D )*, D+
2.2 词法记号的描述与识别 2.2.2 正规式 正规式用来表示简单的语言,叫做正规集 正规式 定义的语言 备注 {} a {a} a (r) | (s) L(r)∪L(s) r和s是正规式 (r)(s)L(r)L(s) r和s是正规式 (r)* (L(r))* r是正规式 (r) L(r) r是正规式 ((a) (b)*)| (c)可以写成ab*| c
2.2 词法记号的描述与识别 • 正规式的例子 = {a, b} • a | b{a, b} • (a | b) (a | b ){aa, ab, ba, bb} • aa | ab | ba | bb{aa, ab, ba, bb} • a* 由字母a构成的所有串集 • (a | b)* 由a和b构成的所有串集 • 复杂的例子 ( 00 | 11 | ( (01 | 10) (00 | 11) (01 | 10) ) ) 句子:01001101000010000010111001
2.2 词法记号的描述与识别 2.2.3 正规定义 对正规式命名,使表示简洁。 d1r1 d2r2 . . . dnrn 各个di的名字都不同 每个ri都是 {d1, d2, …, di-1 }上的正规式
2.2 词法记号的描述与识别 • 正规定义的例子 Pascal语言的标识符集合 letterA | B | … | Z | a | b | …| z digit 0| 1 | … | 9 idletter(letter|digit)*
2.2 词法记号的描述与识别 • 正规定义的例子 Pascal无符号数集合,例1946,11.28,63E8,1.99E6 digit0| 1 | … | 9 digitsdigitdigit* optional_fraction.digits| optional_exponent (E ( + | | ) digits ) | numdigits optional_fraction optional_exponent 简化表示 numdigit+ (.digit+)? (E(+|)? digit+)?
2.2 词法记号的描述与识别 • 正规定义的例子 while while do do relop< | < = | = | < > | > | > = id letter (letter | digit )* numdigit+ (.digit+)? (E (+ | )?digit+)? delimblank | tab | newline wsdelim+
return(relop, LE) = > return(relop, NE) 1 < * return(relop, LT) other 开始 = 0 return(relop, EQ) > return(relop, GE) = 6 other * return(relop, GT) 3 8 2 4 7 5 2.2 词法记号的描述与识别 2.2.4 转换图 关系算符的转换图
letter或digit * 开始 letter other 9 10 return(install_id( )) 11 2.2 词法记号的描述与识别 • 标识符和保留字的转换图
E digit digit digit digit 开始 digit E +/ digit . digit 12 14 17 18 13 15 16 other other other * return( install_num( ) ) 19 2.2 词法记号的描述与识别 • 无符号数的转换图 numdigit+ (.digit+)? (E (+ | )?digit+)?
delim * 开始 delim other 20 21 22 2.2 词法记号的描述与识别 • 空白的转换图 delimblank | tab | newline wsdelim+
a 开始 a b 1 0 b 2 2.3 有 限 自 动 机 2.3.1 不确定的有限自动机(简称NFA) 一个数学模型,它包括: • 状态集合S; • 输入符号集合; • 转换函数move : S ({}) P(S); • 状态s0是开始状态; • F S是接受状态集合。 识别语言 (a|b)*ab 的NFA
a 开始 a b 1 0 b 2 2.3 有 限 自 动 机 • NFA的转换表 状 态 识别语言 (a|b)*ab 的NFA
a a 1 开始 b 0 b 3 2 4 2.3 有 限 自 动 机 • 例识别aa*|bb*的NFA
2.3.2 确定的有限自动机(简称DFA) 一个数学模型,包括: b b b a 开始 1 0 a a 2 2.3 有 限 自 动 机 • 状态集合S; • 输入字母表; • 转换函数move : S S; • 唯一的初态 s S; • 终态集合F S; 识别语言 (a|b)*ab 的DFA
例:识别 ={0,1}上能被能5整除的二进制数 0 1 2 3 4 开始 2.3 有 限 自 动 机 101 0111000 1010 111000 10101 11000
例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 2 3 4 开始 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 2 3 4 1 开始 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 1 2 3 4 1 开始 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 0 0 1 2 3 4 1 开始 1 0 2.3 有 限 自 动 机
例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 1 0 0 1 2 3 4 1 开始 1 0 2.3 有 限 自 动 机