1
1.2编译器相关程序
解释程序:与编译器不同,是立即执行源程序,而不是翻译完成之后才执行目标代码。
根据所使用的语言情况决定解释程序还是编译器。(Basic通常使用解释)
汇编程序:特定计算机上的汇编语言的翻译程序。
汇编语言是计算机的机器语言的符号形式,它极易翻译。
连接程序
编译器和汇编程序都依赖于连接程序。
将不同目标文件中编译或汇编的代码收集到一个可执行的文件中。
装入程序:
处理所有的与指定的基地址或起始地址有关的可重定位的地址。
使可执行代码更灵活,通常是在后台,极少是独立实际程序。
预处理器:
翻译前编译器调用的独立程序。可以删除注释。。。
编辑器
接收由任何生成标准文件的编辑器编写的源程序
调试程序
在被编译的程序中判定执行错误的程序。
与直接执行不同,保存着大多数源代码信息,在预先指定的位置暂停执行
描述器
在执行中搜集目标程序行为统计的程序
项目管理程序
由不同的程序员制作的文件的各个版本整理在一起,保存为一组文件的更改历史,维持正在开发程序的连贯版本
扫描程序:执行词法分析,字符序列收集到记号的单元中
语法分析程序:从扫描程序中获取记号的源代码,定义程序结构的语法分析。
语义分析程序:将所有子表达式类型来标注语法树,检查复制是否使这些类型有意义。
源代码优化程序
代码生成器:得到中间代码,生成目标机器代码。
目标代码优化程序
1.4编译器中的主要数据结构
(1) 记号(t o k e n)将字符收集到一个记号中时,它通常是以符号表示这个记号
(2) 语法树(syntax tre e)
(3) 符号表(symbol table)与标识符有关:函数、变量、常量以及数据类型
(4) 常数表(literal table)存放在程序中用到的常量和字符串
(5) 中间代码(intermediate code)码可以是文本串的数组、临时文本文件或是结构的连接列表。
(6) 临时文件(t e m p o r a ry file)
1.5 编译器结构中的其他问题
(1) 分析和综合
分析:将分析源程序以计算其特性的编译器操作
综合:将生成翻译代码时所涉及到的操作
(2) 前端和后端
只依赖于源语言(前端( front end))的操作和只依赖于目标语言(后端(back end))的操作两部分
扫描程序、分析程序和语义分析程序是前端
代码生成器是后端
一些优化分析可以依赖于目标语言,这样就是属于后端了,
然而中间代码的综合却经常与目标语言无关,因此也就属于前
端了。
(3) 遍:在生成代码之前多次处理整个源程序
根据语言的不同,编译器可以是一遍( one pass)——所有的阶段由一遍完成,其结果是编译得很好,但(通常)代码却不太有效。 P a s c a l语言和 C语言均允许单遍编译。
(4) 语言定义和编译器
(5) 编译器的选项和界面
(6) 出错处理
第2章 词 法 分 析
正则表达式(regular expression)和有穷自动机(finite automata)。
2.1 扫描处理
记号通常定义为枚举类型的逻辑项。
2.2 正则表达式
- 基本正则表达式 它们是字母表中的单个字符且自身匹配。
{ }集不包括任何串,而{ }则包含一个没有任何字符的串。 - 正则表达式运算
选择:用元字符|(竖线)表示。
②连结,由并置表示(不用元字符)。
③重复或“闭包” :由元字符*表示。 - 从各选择对象中选择
- 连结L
L (r s) = L ® L (s), (( a | b ) c) = L ( a | b ) L © = {a, b} {c} = {ac, bc}。 - 重复
例如a *匹配串 、a、a a、a aa . . - 运算的优先和括号的使用
- 正则表达式的名字
的标准正则表达式的一些扩展情况
(1) 一个或多个重复并写作 r *。
(2) 任意字符
句号“ .”表示任意字符匹配的典型元字符
(3) 字符范围
(4) 不在给定集合中的任意字符
非a 字符的正则表达式就是~ a。
中使用插入符“^”和上面所提的字符类来表示互补。任何非a 的字符可写作[ ^ a
(5) 可选的子表达式
natural = [0-9]+
2.3 有穷自动机
请注意这个D FA是如何修改前例中的D FA,它将初始状态变成另一个的接受状态。
新的有穷自动机称作非确定性有穷自动机( nondeterministic finite automaton)或简称为
N FA。在对它下定义之前,还需要为在扫描程序中应用有穷自动机再给出一个概括的讲法: -
转换的概念。
-转换( - t r a n s i t i o n)是无需考虑输入串(且无需消耗任何字符)就有可能发生的转换。
它可看作是一个空串的“匹配”,空串在前面已讲过是写作 的。 -转换在图中的表示就好像
是一个真正的字符:
2.4 从正则表达式到D FA
- 基本正则表达式 基本正则表达式格式a、 或 ,其中a表示字母表中单个字符的匹配,
表示空串的匹配,而 则表示根本不是串的匹配。与正则表达式a等同的N FA(即在其语言中
准确接受)的是:
- 并置 我们希望构造一个与正则表达式r s等同的N FA,其中r 和s 都是正则表达式。假设
已构造好了与r 和s 等同的N FA,并用N FA对应r 且与s 类似来写出它:
- 在各选项中选择 我们希望在与前面相同的假设下构造一个与 r | s 相对应的N FA。如下
进行:
2.4.2 从N FA到D FA
2.6 利用L e x自动生成扫描程序
2.6.1 正则表达式的L e x约定
第3章 上下文无关文法及分析
3.1 分析过程
分析程序的任务是从由扫描程序产生的记号中确定程序的语法结构,以及或隐式或显式地
构造出表示该结构的分析树或语法树。因此,可将分析程序看作一个函数,该函数把由扫描程
序生成的记号序列作为输入,并生成语法树作为它的输出:
3.2 上下文无关文法
上下文无关文法说明程序设计语言的语法结构。
3.2.1 与正则表达式比较
3.2.2 上下文无关文法规则的说明
文法规则是定义在一个字母表或符号集之上。
符号通常是表示字符串的记号。
3.3 分析树与抽象语法树
3.3.1 分析树
3.3.2 抽象语法树
3.4.1 二义性文法
3.4.2 优先权和结合性
算术加法或串的并置表现为可结合运算( associative operation)(若对于所有
的值a、b 和c,且有(a·b)·c = a·(b·c),那么二进制算符“·”也是可结合的)。此时的语
法树仍然各不相同,但是却表示相同的语义值,而且我们可能也无需在意到底使用的是哪一个。
3.5.1 EBNF表示法
3.6.1 上下文无关语言的形式定义
定义 上下文无关文法由以下各项组成:
- 终结符(t e r m i n a l)集合T。
- 非终结符(n o n t e r m i n a l)集合N(与T不相交)。
- 产生式(p r o d u c t i o n)或文法规则(grammar rule)
- 来自集合N的开始符号(start symbol)。
第4章 自顶向下的分析
4.1.1 递归下降分析的基本方法
递归下降分析的概念极为简单:将一个非终结符 A的文法规则看作将识别 A的一个过程的
定义。A的文法规则的右边指出这个过程的代码结构:一个选择中的终结符与非终结符序列与
下一章将要研究的自底向上的分析算法有一些也需要这些集合。
相匹配的输入以及对其他过程的调用相对应,而选择与在代码中的替代情况( c a s e语句和i f语
句)相对应。
4.2.1 LL(1)分析的基本方法
4.2.2 LL(1)分析与算法
这个规则的观点是:在规则1中,在输入中给出了记号a,若a可为匹配生成一个a,则希望
挑选规则A→a。在规则2中,若A派生了空串(通过A→a),且如a 是一个在推导中可合法地出
1 1 4 编译原理及实践 下载
现在A之后的记号,则要挑选A→a以使A消失。
4.3 First集合和F o l l o w集合
4.3.3 构造L L ( 1 )分析表