目录
第一章 引言
1.1程序设计语言
分类:命令式、申述式、面向对象
1.2程序设计语言翻译
翻译程序:将某一种语言描述的程序(源程序——Source Program)翻译成等价的另一种语言描述的程序(目标程序——Object Program)的程序。翻译程序分为两类:解释程序和编译程序。
解释程序:•一边解释一边执行的翻译程序
编译程序:•将源程序完整地转换成机器语言程序或汇编语言程序,然后再处理、执行的翻译程序
编译系统=编译程序+运行系统
1.3 编译程序总体结构
各模块功能:
词法分析器:从左到右扫描组成源程序的字符串,并将其转化为单词串,将发现的标识符登记到符号表中,检查组词方面的错误并进行处理。
语法分析器:组词成句,分层给出程序的组成结构,指出语法错误,制导语义翻译。
语义分析与中间代码生成器:完成由语法分析器识别出来的语法成分的语义的分析,并以中间代码的形式实现对语义分析结果的表示。
代码优化器:对中间代码进行优化处理,使程序能够尽量节省存储空间,更有效地利用机器资源,使得程序的运行速度更快,效率更高。
目标代码生成器:将中间代码转换成目标机上的机器指令或汇编代码。
表格管理:按照编译过程中的信息需求,以不同的类型组织符号表,并以合适的方式查、填、和维护这些表格,提供信息服务,辅助实现编译任务。
出错处理器:进行各种错误的检查、报告、纠正,以及相应的续编译处理.
1.4 编译程序的组织
- 根据系统资源的状况、运行目标的要求……等,可以将一个编译程序设计成多遍(Pass)扫描的形式,在每一遍扫描中,完成不同的任务。
- 遍可以和阶段相对应,也可以和阶段无关。
编译程序设计目标:
为了提高可移植性,将编译程序划分为前端和后端
后端 :
1.5编译程序的生成
自展-使用语言提供的功能来编译该语言自身。
表示语言翻译的T形图
问题一:如何直接在一个机器上实现C语言编译器?
解决:
问题二:A机上有一个C语言编译器,是否可利用此编译器实现B机上的C语言编译器?(移植)
问题三:A机上有一个C语言编译器,现要实现一个新语言NEW的编译器?能利用交叉编译技术么?
第二章 高级语言及其文法
2.1 语言概述
语言:形式化的内容提取
程序设计语言——形式化的内容提取
语言描述形式:文法
语法——语句的组成规则
词法——单词的组成规则
语言学家Chomsky最初从产生语言的角度研究语言,提出了文法
克林(Kleene)在1951年到1956年间,从识别语言的角度研究语言,给出了语言的另一种描述。(自动机)
1959年,Chomsky证明了文法与自动机的等价性。
2.2基本定义
1.字母表∑,字母表中的元素——字母或字符
2.字母表乘积∑1∑2={ab|a∈∑1,b∈∑2}
3.字母表幂运算:
4.字母表的正闭包和克林闭包
5.句子∑*,空句ε、
6.句子xay中的a叫做a在该句子中的一个出现
7.句子x中字符的个数称为字符串的长度,记作|x|
8.句子的并置或联结:xy
9.前缀、真前缀,后缀、真后缀
真xx:不包含原句子
10.两个句子的公共前缀、最大公共前缀、公共后缀、最大公共后缀
11.字串
12.公共子串、最大公共子串
13.语言 ∑*
14.语言乘积L1L2={xy|x∈L1,y∈L2}
15.语言L幂运算,L的克林闭包和正闭包
2.3 文法的定义
16.文法G=(V,T,P,S)
17.推导和规约
19.文法G产生的语言 L(G)={w | S-->w & w∈T* }
文法G可以派生出无穷多个句子,文法的作用就是以有限的规则描述无限的语言现象
20.句型&句子,句子是句子中每个字符都属于终结符,而句型可以包含非终结符
句子一定是句型
2.4 文法的分类
1. 0型文法(短结构文法PSG):满足文法定义的要求
2. 1型文法(上下文有关文法CSG):,除外。
3. 2型文法(上下文无关文法CFG):在1型文法基础上,产生式左部属于语法变量V
4. 3型文法(正规文法RG):
文法包含关系:
2.5 CFG的语法树
语法分析树,又称分析树、推导树、派生树
句型&短语:
- 句型本身是它的短语
- 句型的语法树的任意一个级数至少为2的A-子树的结果是它的短语
- 句型的语法树的任意一个级数为2的A-子树的结果是它的直接短语
- 句型的最左直接短语称为句柄
最左推导:每次推导都施加在句型的最左边的语法变量上。——与最右归约对应
最右推导:
2.6 文法的二义性
二义性定义:文法的句子存在两颗分析树
固有二义性:产生CFL L的所有CFG都是二义性的,则称L为固有二义性,也称为先天二义性