1 / 110

编译原理和技术

编译原理和技术. 课 程 简 介. 课程内容 介绍编译器构造的一般原理和基本实现方法 介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等 强调形式描述技术和自动生成技术 强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语言或目标机器. 课 程 简 介. 学习的意义 对编程语言的设计和实现有深刻的理解,对和编程语言有关的理论有所了解,对宏观上把握编程语言来说,起一个奠基的作用。 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。

Download Presentation

编译原理和技术

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 编译原理和技术

  2. 课 程 简 介 课程内容 • 介绍编译器构造的一般原理和基本实现方法 • 介绍的理论知识:形式语言和自动机理论、语法制导的定义和属性文法、类型论等 • 强调形式描述技术和自动生成技术 • 强调对编译原理和技术的宏观理解,不把注意力分散到枝节算法,不偏向于某种源语言或目标机器

  3. 课 程 简 介 学习的意义 • 对编程语言的设计和实现有深刻的理解,对和编程语言有关的理论有所了解,对宏观上把握编程语言来说,起一个奠基的作用。 • 从软件工程看,编译器是一个很好的实例,所介绍的概念和技术能应用到一般的软件设计之中。 • 大多数程序员同时是简单语言的设计者,有助于提高对这些语言的设计水平。 • 在软件逆向工程、程序理解和软件安全等方面有着广泛的应用。

  4. 课 程 简 介 教材和参考书 • 陈意云、张昱,编译原理,高等教育出版社, 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

  5. 第一章 引 论 • 翻译器、编译器、解释器 • 编译器从逻辑上可以分成若干阶段 • 每个阶段把源程序从一种表示变换成另一种表示 • 通过描述编译器的各个阶段来介绍编译这个课题

  6. 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  7. position := initial + rate * 60 符 号 表 . . . 1 position . . . 2 initial . . . 词法分析器 3 rate id1 := id2 + id3* 60 第一章 引 论

  8. 表达式 表达式 表达式 + 表达式 表达式 标识符 * (initial) 标识符 (rate) 数 (60) 第一章 引 论 表达式的语法特征 • 任何一个标识符都是表达式; • 任何一个数都是表达式; • 如果e1和e2都是表达式,那么  e1 + e2  e1*e2  (e1) 也都是表达式

  9. id1 := id2 + id3* 60 符 号 表 . . . 1 position 语法分析器 . . . 2 initial . . . 3 rate := id1 + id2 * id3 60 第一章 引 论

  10. 符 号 表 . . . 1 position . . . 2 initial 语义分析器 . . . 3 rate := := id1 + id1 + id2 * id2 * id3 60 id3 inttoreal 60 第一章 引 论

  11. 前三个阶段完成对源程序的分析 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  12. 符 号 表 . . . 1 position . . . 2 initial 中间代码生成器 . . . 3 rate := id1 temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 + id2 * id3 inttoreal 60 第一章 引 论

  13. temp1 := inttoreal(60) temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3 符 号 表 . . . 1 position . . . 2 initial . . . 3 rate 代码优化器 temp1 := id3 * 60.0 id1 := id2 + temp1 第一章 引 论

  14. 符 号 表 . . . 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

  15. 源程序 后三个阶段对源程序进行综合 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  16. 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  17. 源程序 解释器和编译器的区别 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  18. 第一章 引 论 • BASIC语言年代解释器 • 功能:它将高级语言的源程序翻译成一种中间语言程序,然后对中间语言程序进行解释执行 • 在那个年代,编译和解释两个功能是合在一个程序中,该程序被称为解释器 • Java语言年代解释器 • 解释器的上述两个功能分在两个程序中 • 前一个编译器,它把源程序翻译成一种叫做字节码的中间语言程序 • 后一个叫做解释器,它对字节码程序进行解释执行

  19. 阶段分组 • 前端 • 后端 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  20. 阶段分组 • 遍 源程序 词法分析器 语法分析器 语义分析器 符号表管理器 出错管理器 中间代码生成器 代码优化器 代码生成器 目标程序 第一章 引 论

  21. 记号 词法分析器 语法分析器 源程序 取下一个记号 符号表 第二章 词法分析 • 本章内容 • 词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务 • 围绕词法分析器的自动生成展开 • 介绍正规式、状态转换图和有限自动机概念

  22. 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” 引号“和”之间的任意字符 串,但引号本身除外

  23. 2.1 词法记号及属性 • 历史上词法定义中的一些问题 • 忽略空格带来的困难 DO 8 I  3. 75 DO8I  3. 75 DO 8 I  3, 75 • 关键字是否保留 IF THEN THEN THEN=ELSE;ELSE … • 关键字、保留字和标准标识符的区别

  24. 2.1 词法记号及属性 2.1.2 词法记号的属性 position := initial + rate * 60的记号和属性值: id,指向符号表中position条目的指针 assign _ op,  id,指向符号表中initial条目的指针 add_op,+ id,指向符号表中rate条目的指针 mul_ op, * num,整数值60

  25. 2.1 词法记号及属性 2.1.3 词法错误 • 词法分析器对源程序采取非常局部的观点 • 难以发现下面的错误 fi (a == f (x) )… • 在实数是a.b格式下,可以发现下面的错误 123. • 紧急方式的错误恢复 • 错误修补

  26. 2.2 词法记号的描述与识别 2.2.1 串和语言 • 字母表:符号的有限集合, 例: = {0, 1} • 串:符号的有穷序列,例:0110,  • 语言:字母表上的一个串集 {, 0, 00, 000, …}, {},  • 句子:属于语言的串 • 串的运算 • 连接 xy,s= s = s • 积(指数) s0为,si为si -1s(i > 0)

  27. 2.2 词法记号的描述与识别 • 语言的运算 • 和:L  M = {s | sL 或 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+

  28. 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

  29. 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

  30. 2.2 词法记号的描述与识别 2.2.3 正规定义 对正规式命名,使表示简洁。 d1r1 d2r2 . . . dnrn 各个di的名字都不同 每个ri都是 {d1, d2, …, di-1 }上的正规式

  31. 2.2 词法记号的描述与识别 • 正规定义的例子 Pascal语言的标识符集合 letterA | B | … | Z | a | b | …| z digit 0| 1 | … | 9 idletter(letter|digit)*

  32. 2.2 词法记号的描述与识别 • 正规定义的例子 Pascal无符号数集合,例1946,11.28,63E8,1.99E6 digit0| 1 | … | 9 digitsdigitdigit* optional_fraction.digits| optional_exponent (E ( + |  |  ) digits ) |  numdigits optional_fraction optional_exponent 简化表示 numdigit+ (.digit+)? (E(+|)? digit+)?

  33. 2.2 词法记号的描述与识别 • 正规定义的例子 while while do do relop< | < = | = | < > | > | > = id letter (letter | digit )* numdigit+ (.digit+)? (E (+ | )?digit+)? delimblank | tab | newline wsdelim+

  34. 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 转换图  关系算符的转换图

  35. letter或digit * 开始 letter other 9 10 return(install_id( )) 11 2.2 词法记号的描述与识别 • 标识符和保留字的转换图

  36. 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 词法记号的描述与识别 • 无符号数的转换图 numdigit+ (.digit+)? (E (+ | )?digit+)?

  37. delim * 开始 delim other 20 21 22 2.2 词法记号的描述与识别 • 空白的转换图 delimblank | tab | newline wsdelim+

  38. 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

  39. a 开始 a b 1 0 b 2 2.3 有 限 自 动 机 • NFA的转换表 状 态 识别语言 (a|b)*ab 的NFA

  40. a a 1  开始 b 0  b 3 2 4 2.3 有 限 自 动 机 • 例识别aa*|bb*的NFA

  41. 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

  42. 例:识别 ={0,1}上能被能5整除的二进制数 0 1 2 3 4 开始 2.3 有 限 自 动 机 101 0111000 1010 111000 10101 11000

  43. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 2 3 4 开始 2.3 有 限 自 动 机

  44. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 2 3 4 1 开始 2.3 有 限 自 动 机

  45. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 1 2 3 4 1 开始 2.3 有 限 自 动 机

  46. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机

  47. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机

  48. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 0 0 1 2 3 4 1 开始 1 2.3 有 限 自 动 机

  49. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 0 0 1 2 3 4 1 开始 1 0 2.3 有 限 自 动 机

  50. 例:识别 ={0,1}上能被能5整除的二进制数 0 0 1 1 0 0 1 2 3 4 1 开始 1 0 2.3 有 限 自 动 机

More Related