把某一种语言程序(称为源语言程序)等价的转换成另一种语言程序(称为目标语言程序)的程序
如:中英互译系统、DBMS语言(DDL、DCL)
把某一种高级语言程序等价的转换成另一种低级语言程序(如:汇编语言或机器语言程序)的程序
编译程序分类:
把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序本身
编译程序与解释程序的区别:编译生成目标程序,而解释不会生成
任务:把中间代码变换成待定机器上的目标代码
依赖于硬件系统结构和机器指令的含义
目标代码的三种形式:
常见的表格:符号名表、常数表、标号表、入口名表、过程引用表
格式:
例子:
出错处理程序:发现源程序中的错误,把有关错误信息报告给用户【语法错误、语义错误】
对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标程序
每遍由从外存上获得前一遍的工作结果开始,完成工作后,把结果存放在外存上。每遍工作完成后所占用的存贮空间大部分被释放
把实在参数的地址传递给相应的形式参数
调用段把实在参数的值计算出来并放在被调用段可以拿到的地方,把值代入
调用过程的作用相当于 把被调用的过程抄到调用出现的地方,但把其中任一出现的形式参数都替换成相应的实在参数
编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项目的单元地址。
如果允许递归、可变数据结构,则必须动态分配。
一个程序设计语言使一个记号系统,其完整的定义应包括语法和语义两个方面
- 语法是一组规则,用它可以形成和产生一个合适的程序
- 语法只定义什么样的符号序列是合法的,与这些符号的含义毫无关系
阐明语法的一个工具是文法,这是形式语言理论的基本概念之一
文法是定义或描述语法结构的一组形式规则
文法定义为一个四元组G=(VN, VT, S, P)
对于这些符号的阐述:
VN:非空 有限的非终结符集【字符集】
VT:非空 有限的终结符集【字符集】
S:开始符号
P:产生式集合
其中, VN ∩ VT =Φ,S∈ VN
这句话也就是说:
P中产生式一般形式为: A→α|β,其中 A∈ VN ,α, β ∈( VN ∪ VT )*
这句话也就是说:
对产生式施加不同的限制得到不同类型的文法
0型(无限制文法):
规则形式:
ɑ→β:
解释:
这个基本没有限制,只要求左边非空且至少有一个非终结符即可
PS:但是如果左边都没有非终结符,全是终结符了,那么这个产生式也就没有意义了呀,所以说基本没有限制
1型(上下文有关):
规则形式:
α→β:
解释:
这个文法又叫做【上下文有关】,这个所谓的上下文就是γ1和γ2,那么其实这个与0型的区别就在于,左边的α字符串的长度不能大于右边的β字符串的长度
2型(上下文无关):
规则形式:
A→δ:
解释:
这个就是:产生式的左边A为一个非终结字符,而右边β是一个非终结集和终结集的并集的正闭包【一个非空字符串】
3型(右线性):
规则形式:
A→αB或A→α(右线性):
解释:
这个产生式的形式如下:
其他:
左线性(比较右线性即可)
正规文法:
规则形式:
A→αB或A→α
解释:
【前面两条】右边只能是 单个的终结符 或者 一个终结符+一个非终结符的字符串
【第三条】如果有一个非终结符可以变成空串,那么这个非终结符不能出现在右边的字符串中
2型文法扩充:
规则形式:
A → δ,A ∈ VN
解释:
比2型文法多了一条:
允许有空产生式: A → ε
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。
0型文法 产生的语言为 0型语言
上下文有关文法(1型文法) 产生的语言为 上下文有关语言
上下文无关文法(2型文法) 产生的语言为 上下文无关文法
正规文法 产生的语言为 正规语言
现今大多数高级程序设计语言采用**上下文无关文法(2型文法)**来描述其语法已经足够了。
设文法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是等价的
【IMPORTANT】性质:在语法树生长的任何时候,所有那些没有后代的端末结自左至右的排列起来,就是一个句型。
从左至右逐个字符地扫描源程序,产生一个个单词符号
把作为字符地源程序改造为单词符号串组成地中间程序,执行词法分析任务地程序称为词法分析器或称扫描器
常常把词法分析程序作为独立的一遍或作为被语法分析程序所调用的子程序
作为独立的一遍:
语法分析前进行词法分析,把单词符号串形成中间文件存贮
相对独立方式
当采用递归下降分析等技术实现一趟编译程序时常采用这种方式
完全独立方式
采用词法分析工作完全独立的原因:
单词——程序语言的基本语法符号
如:基本字,标识符,常熟,运算符,界符等
词法分析器中,单词的输出形式:
【二元式】(单词类别,单词内部码值)
单词类别:表示单词种类,常用整数编码,它是语法分析需要的
一般分为以下5种:
注意:一种语言的单词如何分类、怎样编码,主要取决于技术上的方便
单词自身的值:是编译其他阶段所需要的信息
例子:
一个分类表
注意:
终态是识别出了一个单词,而不是这个程序停下来,
比如说,if1这个标识符,当识别出if时,已经到达了终态,但是实际上还可以往后面再识别一个1,组成if1这个标识符
初态:程序入口
理论上状态转化图可以没有终态
方法:每个结点对应一段程序,前面状态的结点的程序调用其后继结点的程序
对正规式而言(优先级递增)
|【或】 .【连接,通常省略这个符号】 *【闭包】
对正规集而言(优先级递增)
∪ ∩ *
若两个正规式对表示的正规集相同,则认为二者等价
一个确定的有穷自动机(DFA)D是一个五元组:
D = ( K,∑,M,S,F) 其中:
K:有穷非空的状态集合
∑:有穷非空的输入符号字母表
M:转换函数,是在K×Σ→K上的映像
即,M ( ki,a ) = kj,(ki ∈ K,kj ∈ K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;
S:S ∈ K,是唯一的一个初态
F:F ⊃ K,是非空的终态集合
例子:
如果一个DFA M的输入字母表为∑,则我们也称M是∑上的一个DFA。
可以证明:∑上的一个子集是正规的,当且仅当存在∑上的DFA M,使得V = L(M)
DFA的确定性表现在映射δ:S×Σ→S是一个单值函数。
也就是说,对任何状态 s ∈ S和输入符号a∈Σ,δ(s, a) 唯一地确定了下一状态。
特别地,若DFA M的初态同时又是终态,该DFA M可识别空字ε
显然,若DFA M中字母表Σ含n个字母,则任何一个状态顶多只有n条发出弧
与确定有限自动机的区别:转换函数不再是单值函数了,也就是说可以是这样M(K,T)={K1,K2,…,Kn}