编译原理 笔记整理
1.1 《编译原理》引论
基本概念——发展
- 机器语言
- 汇编语言
- 高级语言
- 工具语言
基本概念——翻译程序
把某一种语言程序(称为源语言程序)等价的转换成另一种语言程序(称为目标语言程序)的程序
如:中英互译系统、DBMS语言(DDL、DCL)
基本概念——编译程序
把某一种高级语言程序等价的转换成另一种低级语言程序(如:汇编语言或机器语言程序)的程序
编译程序分类:
- 诊断编译程序&优化编译程序
- 交叉编译程序&可变目标编译程序运行
基本概念——解释程序
把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身
编译程序与解释程序的区别:编译生成目标程序,而解释不会生成
基本概念——执行高级语言程序的步骤
1.2 编译过程
1. 词法分析
- 任务:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号
- 依循的原则:构词原则
- 描述工具:正规式和有限自动机
2. 语法分析
- 任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位
- 依循的原则:语法规则
- 描述工具:上下文无关文法
3. 中间代码产生
- 任务:对各类不同语法范畴按语言的语义进行初步翻译
- 依循的原则:语义规则
- 中间代码:三元式、四元式、树形结构等
4. 优化
- 任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码
- 依循的原则:程序的等价变换规则
5. 目标代码产生
-
任务:把中间代码变换成待定机器上的目标代码
依赖于硬件系统结构和机器指令的含义
-
目标代码的三种形式:
- 绝对指令代码【可直接运行】
- 可重新定位指令代码【需要连接装配】
- 汇编指令代码【需要进行汇编】
编译程序的逻辑结构
表格与表格管理
常见的表格:符号名表、常数表、标号表、入口名表、过程引用表
格式:
例子:
出错处理
出错处理程序:发现源程序中的错误,把有关错误信息报告给用户【语法错误、语义错误】
遍
对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标程序
每遍由从外存上获得前一遍的工作结果开始,完成工作后,把结果存放在外存上。每遍工作完成后所占用的存贮空间大部分被释放
编译前端与后端
- 编译前端:与源语言有关,如词法分析、语法分析、语义分析与中间代码产生,与机器无关的优化
- 编译后端:与目标机有关,与目标机有关的优化,目标代码产生
1.3 高级语言程序简介
一、参数传递
传地址
把实在参数的地址传递给相应的形式参数
传值
调用段把实在参数的值计算出来并放在被调用段可以拿到的地方,把值代入
传名
调用过程的作用相当于 把被调用的过程抄到调用出现的地方,但把其中任一出现的形式参数都替换成相应的实在参数
二、存贮管理
静态存贮分配
编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项目的单元地址。
动态存贮分配
如果允许递归、可变数据结构,则必须动态分配。
-
栈式:整个程序数据空间安排在一个栈中
-
堆式:允许自由地申请和退还空间
2.1 程序语言的定义
一个程序设计语言使一个记号系统,其完整的定义应包括语法和语义两个方面
- 语法是一组规则,用它可以形成和产生一个合适的程序
- 语法只定义什么样的符号序列是合法的,与这些符号的含义毫无关系
阐明语法的一个工具是文法,这是形式语言理论的基本概念之一
字符串集合的一些运算
文法
文法是定义或描述语法结构的一组形式规则
2.2 文法的形式化定义和分类
文法的定义
文法定义为一个四元组G=(VN, VT, S, P)
对于这些符号的阐述:
文法的分类
对产生式施加不同的限制得到不同类型的文法
-
0型(无限制文法):
规则形式:
ɑ→β:
- α ∈ ( VN∪VT ) +
- β ∈ ( VN ∪ VT )*
- 且 α中至少含有一个非终结符
解释:
这个基本没有限制,只要求左边非空且至少有一个非终结符即可
PS:但是如果左边都没有非终结符,全是终结符了,那么这个产生式也就没有意义了呀,所以说基本没有限制
-
1型(上下文有关):
规则形式:
α→β:
- 有 1≦|α|≦|β|
- 其中α=γ1Aγ2
- A ∈ VN
- γ1, γ2, β ∈ ( VN ∪ VT )*
解释:
这个文法又叫做【上下文有关】,这个所谓的上下文就是γ1和γ2,那么其实这个与0型的区别就在于,左边的α字符串的长度不能大于右边的β字符串的长度
-
2型(上下文无关):
规则形式:
A→δ:
- A ∈ VN
- δ ∈ ( VN ∪ VT )+
解释:
这个就是:产生式的左边A为一个非终结字符,而右边β是一个非终结集和终结集的并集的正闭包【一个非空字符串】
-
3型(右线性):
规则形式:
A→αB或A→α(右线性):
- A,B ∈ VN
- α ∈ ( VT )*
解释:
这个产生式的形式如下:
- 左边的A为一个非终结字符
- 右边的字符串有如下的性质:左边全为终结字符,最右边有一个或者没有非终结字符
-
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
-
0型文法 产生的语言为 0型语言
上下文有关文法(1型文法) 产生的语言为 上下文有关语言
上下文无关文法(2型文法) 产生的语言为 上下文无关文法
正规文法 产生的语言为 正规语言
-
现今大多数高级程序设计语言采用**上下文无关文法(2型文法)**来描述其语法已经足够了。
2.3 文法和语言
推导
设文法G = ( VN, VT, P, S),A → α是其中的产生式
若有符号串γ,δ ∈ ( VN ∪ VT )*,使得
U = γAδ,w = γαδ,则称w为U使用产生式A → α所得到的直接推导,记为U ⇒ w,即γAδ ⇒ γαδ【也称w可直接归约到U】
最左推导和最右推导
【最左推导】:每一步推导操作的都是字符串最左边的非终结符
【最右推导】:每一步推导操作的都是字符串最右边的非终结符
规范推导
最右归约和最左归约
【最右归约】——【最左推导】
【最左归约】——【最右推导】
句型、句子、语言的定义
-
这S是文法G的识别符号(也就是开始字符),
如果S=(*)=>u【经过0步或多步推导】,
则称符号串u为文法G的句型
-
这S是文法G的识别符号(也就是开始字符),
如果S=(*)=>u【经过0步或多步推导】,且u ∈ (VT)*【u为终结集的自反闭包,也就是说u是由非终结符组成的字符串】
则称符号串u为文法G的句子
-
这S是文法G的识别符号(也就是开始字符),
文法G的语言L(G) = {u|S=(*)=> 且 u ∈ ( VT )*},
即文法的语言是文法所有句子的集合
文法等价
若L(G1) = L(G2),则称文法G1和文法G2是等价的
2.4 语法分析树
- 我们用一张树型结构的图来描述一个句子的推导,这种表示称为语法树。
- 语法树的根结由文法开始符号标记。随着推导的进行,当某个非终结符被它的候选式所替换时,此非终结符生出其下一代新结,候选式中自左至右没有符号对应着一个新结。
【IMPORTANT】性质:在语法树生长的任何时候,所有那些没有后代的端末结自左至右的排列起来,就是一个句型。
文法的二义性
- 一个文法,如果它的一个句子有两棵或两棵以上的语法树,则称此句子具有二义性。如果一个文法含有二义性的句子,则该文法具有二义性。
- 换一个说法:如果一个文法存在某个句子对应两棵或两棵以上不同的语法树,则称该文法是二义的
3.1 词法分析概述
词法分析程序的任务
从左至右逐个字符地扫描源程序,产生一个个单词符号
把作为字符地源程序改造为单词符号串组成地中间程序,执行词法分析任务地程序称为词法分析器或称扫描器
词法分析程序的功能
- 主要功能
- 读入源程序字符串,识别开具有独立含义地最小语法单位——单词(符号)
- 把单词变换成长度统一地且为定长地属性字
- 其他功能
词法分析程序的安排
常常把词法分析程序作为独立的一遍或作为被语法分析程序所调用的子程序
词法分析程序的实现方式
-
完全独立方式
采用词法分析工作完全独立的原因:
- 简化设计,降低语法分析的复杂性
- 提高编译效率
- 增加编译系统的可移植性
词法分析程序的输出形式
单词——程序语言的基本语法符号
如:基本字,标识符,常熟,运算符,界符等
词法分析器中,单词的输出形式:
【二元式】(单词类别,单词内部码值)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)