编译原理知识点.docx
- 文档编号:9239327
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:26.84KB
编译原理知识点.docx
《编译原理知识点.docx》由会员分享,可在线阅读,更多相关《编译原理知识点.docx(18页珍藏版)》请在冰豆网上搜索。
编译原理知识点
第一章引言
1.从面向机器的语言到面向人类的语言
汇编指令:
用符号表示的指令被称为汇编指令
汇编语言:
汇编指令的集合称为汇编语言
2.语言之间的翻译
转换(也被称为预处理):
高级语言之间的翻译,如FORTRAN到ADA的转换
编译:
高级语言可以直接翻译成机器语言,也可以翻译成汇编语言,这两个翻译过程称为编译
汇编:
从汇编语言到机器语言的翻译被称为汇编
交叉汇编:
将一个汇编语言程序汇编成为可在另一机器上运行的机器指令成为交叉汇编
反汇编:
把机器语言翻译成汇编语言
反编译:
把汇编语言翻译成高级语言
3.编译器与解释器
(1)语言翻译的两种基本形态
解释器与编译器的主要区别:
运行目标程序时的控制权在解释器而不在目标程序.
(2)各自特点
∙编译器:
工作效率高,即时间快、空间省;交互性与动态性差,可移植性差.
∙解释器:
工作效率低,,即时间慢、空间费;交互性与动态性好,可移植性好.
共同点:
均完成对源程序的翻译.
差异:
编译器采用先翻译后执行,解释器采用边翻译边执行.
4.编译器的工作原理与基本组成
(0)通用程序设计语言的主要成份声明+操作=完整定义
(1)以过程为基本结构的程序设计语言的组成
∙声明性语句:
提供操作对象的性质,如数据类型、值、作用域等;
∙操作性语句:
确定操作的计算次序,完成实际操作。
∙过程定义=过程头+过程体
(2)以阶段划分编译器
注:
符号表管理器和出错处理贯穿编译器工作的各个阶段.
(3)编译器各阶段工作
1>词法分析:
词法分析的输入是源程序,输出是识别出的记号流.目的是识别单词.至少分以下几类:
关键字(保留字)、标识符、字面量、特殊符号
2>语法分析:
输入是词法分析器返回的记号流,输出是语法树.目的是得到语言结构并以树的形式表示.对于声明性语句,进行符号表的查填,对于可执行语句,检查结构合理的表达式运算是否有意义.
3>语义分析:
根据语义规则对语法树中的语法单元进行静态语义检查,如类型检查和转换等,目的在于保证语法正确的结构在语义分析上也是合法的.
4>中间代码生成(可选):
生成一种既接近目标语言,又与具体机器无关的表示,便于代码优化与代码生成.
(到目前为止,编译器与解释器可以一致)
5>中间代码优化(可选):
局部优化、循环优化、全局优化等;优化实际上是一个等价变换,变换前后的指令序列完成同样的功能,但在占用的空间上和程序执行的时间上都更省、更有效
6>目标代码生成:
不同形式的目标代码—汇编语言形式、可重定位二进制代码形式、内存形式(Load-and-Go)
7>符号表管理:
合理组织符号,便于各阶段查找\填写等.
8>出错处理:
动态错误:
源程序中的逻辑错误,发生在程序运行的时候。
也称为动态语义错误
静态错误:
静态错误分为语法错误和静态语义错误.<1>语法错误:
有关语言结构上的错误,如单词拼写错误、表达式缺少操作数、begin和end不匹配<2>静态语义错误:
分析源程序时可以发现的语言意义上的错误,如加法的两个操作数一个是整形变量,另一个是数组名
(4)编译器的分析\综合模式
逻辑上把编译器分为分析(前端)部分和综合(后端)部分.
1>分析(前端):
语言结构和意义的分析;从词法分析到中间代码生成各阶段的工作
2>综合(后端):
语言意义处理;从中间代码生成到目标代码生成的各阶段的工作
3>编译器和解释器的区别往往是在形成中间代码之后开始的.
5.编译器扫描的遍数
每个阶段将程序完整分析一遍的工作模式称为一遍扫描。
(将源程序或源程序的某种形式的中间表示完整分析一遍,亦称作一遍扫描)
第二章词法分析
1.词法分析中的若干问题
(1)记号、模式与单词
单词的分类:
关键字(保留字)、标识符、字面量、特殊符号
模式(pattern):
产生/识别单词的规则
记号(token):
按照某个模式(或规则)识别出的元素(一组)
单词(lexeme):
被识别出的元素的值(字符串本身),也称为词值
(2)词法分析器的作用与工作方式
词法分析器的作用:
1>识别记号并交给语法分析器(根据模式识别记号)
2>滤掉源程序中的无用成分,如注释、空格和回车等
3>处理与具体平台有关的输入(如文件结束符的不同表示等)
4>调用符号表管理器和出错处理器,进行相关处理
工作方式:
1.单独一遍扫描
2.作为语法分析器的子程序
3.并行方式
2.模式的形式化描述
(1)字符串与语言
语言L是有限字母表∑上有限长度字符串的集合.
定义中强调两个有限,因为计算机的表示能力有限:
1>字母表是有限的,即字母表中元素是有限多个;
2>字符串的长度是有限的,即字符串中字符个数是有限多个。
(字符串与字符串集合相关的概念与运算,如前缀、后缀、子串、子序列等,字符串的并、交、连接、差、闭包)
(2)正规式与正规集
令Σ是一个有限字母表,则Σ上的正规式及其表示的集合递归定义如下:
1.ε是正规式,它表示集合L(ε)={ε}
2.若a是Σ上的字符,则a是正规式,它表示集合L(a)={a}
3.若正规式r和s分别表示集合L(r)和L(s),则
(a)r|s是正规式,表示集合L(r)∪L(s),
(b)rs是正规式,表示集合L(r)L(s),
(c)r*是正规式,表示集合(L(r))*,
(d)(r)是正规式,表示的集合仍然是L(r)。
括弧用来改变运算的先后次序!
可用正规式描述(其结构)的语言称为正规语言或正规集。
若运算的优先级和结合性做下述约定:
1.三种运算均具有左结合性质;
2.优先级从高到低顺序排列为:
闭包运算、连接运算、或运算。
则正规式中不必要的括号可以被省略。
若正规式P和Q表示了同一个正规集,则称P和Q是等价的,记为P=Q
(3)简化正规式描述(主要是简化书写上的复杂)
(a)正闭包若r是表示L(r)的正规式,则r+是表示(L(r))+的正规式,且下述等式成立:
r+=rr*=rr,r=r+|ε;
+与*具有相同的运算结合性和优先级(b)可缺省若r是正规式,则r?
是表示L(r)∪{ε}的正规式,且下述等式成立:
r?
=r|ε
?
与*具有相同的运算结合性和优先级(c)串若r是若干字符进行连接运算构成的正规式,则:
串“r”=r,且:
ε=“”,a=“a”(a是Σ的任一字符)(d)字符组若r是若干字符进行|运算构成的正规式,则可改写为[r’],其中r’可以有如下两种书写形式:
枚举:
如a|b|e|h,可写为[abeh]:
分段:
如0|1|2|3|4|5|6|7|8|9|a|b|c|d|e,可写为:
[0-9a-e](e)非字符组若[r]是一个字符组形式的正规式,则[^r]是表示∑-L([r])的正规式。
3.记号的识别——有限自动机
(1)不确定的有限自动机(NondeterministicFiniteAutomaton,NFA)
NFA是一个五元组(5-tuple):
M=(S,∑,move,s0,F),其中
(1)S是有限个状态(state)的集合;
(2)∑是有限个输入字符(包括ε)的集合;
(3)move是一个状态转移函数,move(si,ch)=sj表示,当前状态si下若遇到输入字符ch,则转移到状态sj;
(4)s0是唯一的初态(也称开始状态);
(5)F是终态集(也称接受状态集),它是S的子集,包含了所有的终态。
<1>直观的表示方式
①状态转换图:
用一个有向图来直观表示NFA
②状态转换矩阵:
用一个矩阵来直观表示NFA(矩阵中,状态对应行,字符对应列)
<2>NFA(识别记号)的特点
NFA识别记号的最大特点是它的不确定性,即在当前状态下对同一字符有多于一个的下一状态转移。
具体体现:
定义:
move函数是1对多的;
状态转换图:
从同一状态出发,可通过多于一条标记相同字符的边转移到不同的状态;
状态转换矩阵:
M[si,a]是一个状态的集合
<3>NFA识别记号存在的问题
1.只有尝试了全部可能的路径,才能确定一个输入序列不被接受,而这些路径的条数随着路径长度的增长成指数增长
2.识别过程中需要进行大量回朔,时间复杂度升高且算法复杂
(2)确定的有限自动机(DeterministicFiniteAutomaton,DFA)
定义:
DFA是NFA的一个特例,其中:
(1)没有状态具有ε状态转移(ε-transition),即状态转换图中没有标记ε的边;
(2)对每个状态s和每个字符a,最多有一个下一状态。
特点:
与NFA相比,DFA的特征:
确定性
定义:
move(si,a)函数都是1对1的;
转换图从一个状态出发的任2条边上的标记均不同;
转换矩阵:
M[si,a]是一个状态且字母表不包括ε。
提示:
正规式和有限自动机从两个侧面表示正规式。
正规式是描述,自动机是识别。
4.从正规式到词法分析器
构造词法分析器的一般方法和步骤:
1.用正规式描述模式(为记号设计正规式);
2.为每个正规式构造一个NFA,它识别正规式所表示的正规集;
3.将构造的NFA转换成等价的DFA,这一过程也被称为确定化;
4.优化DFA,使其状态数最少,这一过程也被称为最小化;
5.根据优化后的DFA构造词法分析器。
(1)从正规式到NFA
Thompson算法
(2)从NFA到DFA
-smove(S,a):
从状态集S出发,标记为a的下一状态全体。
与move(s,a)的唯一区别:
用状态集取代状态-ε-闭包(T):
从状态集T出发,不经任何字符达到的状态全体-“子集法”构造DFA
(3)最小化DFA
①对于任何两个状态t和s,若从一状态出发接受输入字符串ω,而从另一状态出发不接受ω.
或者,②从t出发和从s出发到达不同的接受状态,则称ω对状态t和s是可区分的.
不可区分的状态位于一个组内,可以合并成一个状态.
主要步骤:
1.初始划分:
终态组,非终态组;
2.利用可区分的概念,反复分裂划分中的组Gi,直到不可再分裂;
3.由最终划分构造D',关键是选代表和修改状态转移;
4.消除可能的死状态和不可达状态。
5.从DFA构造词法分析器
分类:
表驱动型的词法分析器;直接编码的词法分析器
比较:
表驱动
直接编码
分析器的速度
慢
快
程序与模式的关系
无关
有关
适合的编写方法
工具生成
手工编写
分析器的规模
较大
较小
第三章语法分析
词法分析:
记号的集合,字符串由字母组成,线性结构
语法分析:
句子的集合,句子由记号组成,非线性结构(树)
语法分析的双重含义:
∙语法规则:
上下文无关文法(子集:
LL文法或LR文法)
∙语法分析:
下推自动机(LL或LR分析器)、自上而下分析、自下而上分析
1.语法分析的若干问题
许多编译器,特别是由自动生成工具构造的编译器,往往其前端的中心部件就是语法分析器
(1)语法分析器的作用
∙根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树)
∙检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适
当处理
(2)语法错误的处理原则
源程序中可能出现的错误
语法(包括词法)错误和语义错误(静态语义错误和动态语义错误)
注:
跟第一章的分类角度不同,第一章是从静态错误(语法错误,静态语义错误)和动态错误(动态语义错误)分类的,但是殊途同归。
词法错误:
指非法字符或拼写错关键字、标识符等
语法错误:
指语法结构出错,如少分号、括号不匹配、begin/end不配对等
静态语义错误:
如类型不一致、参数不匹配等
动态语义错误(逻辑错误):
如死循环、变量为零时作除数等
2.上下文无关文法(CFG)
(1)上下文无关文法(ContextFreeGrammar,CFG)
CFG是一个四元组G=(N,T,P,S),其中
(1)N是非终结符(Nonterminals)的有限集合;
(2)T是终结符(Terminals)的有限集合,且N∩T=Φ;
(3)P是产生式(Productions)的有限集合,A→α,其中A∈N(左部),α∈(N∪T)*(右部),若α=ε,则称A→ε为空产生式(也可以记为A→);
(4)S是非终结符,称为文法的开始符号(Startsymbol)
注:
S∈N,N可以出现在产生式左边和右边,T绝不出现在产生式左边.
(2)CFG产生语言的基本方法-推导
CFG(产生式)通过推导的方法产生语言,即(通俗地讲)从开始符号S开始,反复使用产生式:
将产生式左部的非终结符替换为右部的文法符号序列(展开产生式,用=>表示),直到得到一个终结符序列。
1>直接推导:
利用产生式产生句子的过程中,将用产生式A→γ的右部代替文法符号序列αAβ中的A得到αγβ的过程,称αAβ直接推导出αγβ,记作:
αAβ=>αγβ
2>零步或多步推导:
若对于任意文法符号序列α1,α2,...αn,有α1=>α2=>...=>αn,则称此过程为零步或多步推导,记为:
α1=*>αn,其中α1=αn的情况为零步推导。
3>至少一次推导:
若α1≠αn,即推导过程中至少使用一次产生式,则称此过程为至少一步推导,记为:
α1=+>αn
(推导具有自反性和传递性)
4>由CFGG所产生的语言L(G)被定义为:
L(G)={ω┃Sωandω∈T*},
L(G)称为上下文无关语言(ContextFreeLanguage,CFL),ω称为句子。
若S=*>α,α∈(N∪T)*,则称α为G的一个句型。
句子一定是句型,反之不是。
5>在推导过程中,若每次直接推导均替换句型中最左边的非终结符,则称为最左推导,由最左推导产生的句型被称为左句型。
类似的可以定义最右推导与右句型,最右推导也被称为规范推导。
(3)推导、分析树与语法树
1、分析树既反映语言结构的实质,也反映推导过程。
2、对CFGG的句型,分析树被定义为具有下述性质的一棵树。
(1)根由开始符号所标记;
(2)每个叶子由一个终结符、非终结符、或ε标记;
(3)每个内部结点由一个非终结符标记;
(4)若A是某内部节点的标记,且X1,X2,...,Xn是该节点从左到右所有孩子的标记,则A→X1X2...Xn是一个产生式。
若A→ε,则标记为A的结点可以仅有一个标记为ε的孩子。
注:
分析树的叶子,从左到右构成G的一个句型。
若叶子仅由终结符标记,则构成一个句子。
3、对CFGG的句型,表达式的语法树被定义为具有下述性质的一棵树:
(1)根与内部节点由表达式中的操作符标记;
(2)叶子由表达式中的操作数标记;
(3)用于改变运算优先级和结合性的括号,被隐含在语法树的结构中。
∙语法树是表示表达式结构的最好形式
(4)二义性与二义性的消除
二义性:
若文法G对同一句子产生不止一棵分析树,则称G是二义的.
结论:
1>一个句子有多于一棵分析树,仅与文法和句子有关,与采用的推导方法无关;
2>造成文法二义的根本原因:
文法中缺少对文法符号优先级和结合性的规定
二义性消除的方法:
①改写二义文法为非二义文法;
②规定二义文法中符号的优先级和结合性,使仅产生一棵分析树。
3.语法与文法简介
(1)正规式与上下文无关文法
∙记号可以用正规式描述,正规式适合描述线性结构,如标识符、关键字、注释等.
∙句子可以用CFG描述,CFG适合描述具有嵌套(层次)性质的非线性结构,如不同结构的句子if-then-else\while-do等
正规式所描述的语言结构均可以用CFG描述,反之不一定.
(2)上下文有关文法CSG
典型的这类语言结构包含:
计数问题的抽象、变量的声明与引用、过程调用时形参与实参的一致性检查等.描述它们的文法被称为上下文有关文法(ContextSensitiveGrammar,CSG).这些语言结构无法用上下文无关文法CSG来描述.
(3)形式语言与自动机简介
若文法G=(N,T,P,S)的每个产生式α→β中,均有α∈(N∪T),且至少含有一个非终结符,β∈(N∪T),则称G为0型文法.
对0型文法施加以下第i条限制,即得到i型文法。
1>G的任何产生式α→β(S→ε除外)满足|α|≤|β|;
2>G的任何产生式形如A→β,其中A∈N,β∈(N∪T)*;
3>G的任何产生式形如A→a或者A→aB(或者A→Ba),其中A和B∈N,a∈T。
文法
语言
自动机
短语文法(0型)
短语结构语言
图灵机
CSG(1型)
CSL
线性界线自动机
CFG(2型)
CFL
下推自动机
正规文法(3型)
正规集
有限自动机
4.自上而下语法分析
分为:
递归下降分析法、预测分析法
基本思想:
对任何一个输入序列ω,从S开始进行最左推导,直到得到一个合法的句子或发现一个非法结构。
整个自上而下分析是一个试探的过程,是反复使用不同产生式谋求与输入序列匹配的过程。
提前准备——重写文法:
1.消除左递归,以避免陷入死循环;2.提取左因子,以避免回溯.
(1)消除左递归
定义:
若文法G中的非终结符A,对某个文法符号序列α存在推导A=+>Aα,则称G是左递归的。
若G中有形如A→Aα的产生式,则称该产生式对A直接左递归。
<1>消除文法的直接左递归
A→Aα|β替换为A→βA'
A'→αA'|ε
首先,整理A产生式为如下形式:
A→Aα1|Aα2|...|Aαm|β1|β2|...|βn
然后用下述产生式代替A产生式:
A→β1A'|β2A'|...|βnA'
A'→α1A'|α2A'|...|αmA'|ε
<2>消除文法的左递归
核心思想:
将无直接左递归的非终结符展开到其他产生式,然后消除其他产生式中的直接左递归(如果有的话)
若G产生句子的过程中出现A=+A的推导,则无法消除左递归(出现回路)
(2)提取左因子
<1>提取文法的左因子
左因子产生原因:
公共前缀:
A→αβ1|αβ2
方法:
将A→αβ1|αβ2|γ
替换为A→αA'|γA'→β1|β2
(3)递归下降分析
直接以程序代码(的方式)模拟产生式产生语言的过程:
基本思想:
每个非终结符对应一个子程序(函数),过程体中:
∙产生式右部的非终结符:
对应子程序调用,
∙产生式右部的终结符:
与输入记号序列进行匹配。
特点:
1>子程序是递归的(因为文法是递归的);
2>程序与文法相关;
3>它对文法的限制是不能有公共左因子和左递归;
4>它是一种非形式化的方法,只要能写出子程序,用什么样的方法和步骤均可。
(4)预测分析器
☆预测分析器由一张预测分析表、一个符号栈和一个驱动器组成,数学模型是下推自动机。
☆对文法的限制是不能有公共左因子和左递归
预测分析器的核心概念:
1>分析方法:
格局与格局变换
2>分析表+驱动器(模拟算法)
3>预测分析表的构造
4>LL(文法、语言、分析器)
☆开始格局的剩余输入是全部输入序列,而接收格局中剩余输入应该为空,任何其他格局或出错格局中的剩余输入应该是全部输入序列的一个后缀.
☆改变格局的动作:
①匹配终结符:
若top=ip(但≠#),则pop且next(ip);
②展开非终结符:
若top^=X且M[X,ip^]=α(X→α),则pop且push(α);
③报告分析成功:
若top^=ip^=#,则分析成功并结束;
④报告出错:
其它情况,调用错误恢复例程.
☆驱动器算法
☆构造预测分析表
步骤:
1.构造文法符号X的FIRST集合和非终结符的FOLLOW集合;2.根据两个集合构造预测分析表.
通俗地讲,α的FIRST集合就是从α开始可以导出的文法符号序列中的开头终结符。
而A的FOLLOW集合,就是从开始符号可以导出的所有含A的文法符号序列中紧跟A之后的终结符.
<1>计算X的FIRST集合-----自下而上计算
<2>计算所有非终结符的FOLLOW集合——自上而下计算
<3>构造预测分析表
<4>LL
(1)文法
文法G被称为是LL
(1)文法,当且仅当为它构造的预测分析表中不含多重定义的条目。
由此分析表所组成的分析器被称为LL
(1)分析器,它所分析的语言被称为LL
(1)语言。
☆第一个L代表从左到右扫描输入序列,第二个L表示产生最左推导,1表示在确定分析器的每一步动作时向前看一个终结符.
推论3.2G是LL
(1)的,当且仅当G的任何两个产生式A→α|β满足:
1.对任何终结符a,α和β不能同时推导出以a开始的串;即First(α)∩First(β)=∅
2.α和β最多有一个可以推导出ε;
3.若β=*>ε,则α不能导出以FOLLOW(A)中终结符开始的任何串.即First(α)∩Follow(A)=∅
☆无论是递归下降子程序法还是非递归的预测分析法,他们都只能处理LL
(1)文法.
5.自下而上语法分析
☆自上而下分析采用的是推导;自下而上分析采用的是归约(规范归约—剪句柄—移进/归约分析—SLR
(1)分析器).
(1)自下而上分析的基本方法
☆基本思想:
最左归约.
对于每个输入序列ω:
从左到右扫描ω;从ω开始,反复用产生式的左部替换产生式的右部(即当前句型中的句柄)、谋求对ω的匹配,最终得到文法的开始符号,或者发现一个错误。
☆基本概念:
a)>设αβδ是文法G的一个句型,若存在S=*>αAδ,A=+>β,则称β是句型αβδ相对于A的"短语".
>特别的,若有A→β,则称β是句型αβδ相对于产生式A→β的"直接短语".
>一个句型的最左直接短语被称为"句柄".
特征:
1.短语:
以非终结符为根子树中所有从左到右的叶子;
2.直接短语:
只有父子关系的子树中所有从左到右排列的叶子(树高为2);
3.句柄:
最左边父子关系树中所有从左到右排列的叶子(句柄是唯一的)
b)最左归约:
若α是文法G的句子且满足下述条件,则称序列αn,αn-1,...,α0是α的一个最左归约。
1)αn=α
2)α0=S(S是G的开始符号)
3)对任何i(0
☆最左归约的逆过程是一个最右推导,分别称最右推导和最左归约为规范推导和规范归约.
c)移进-归约分析器
1.工作方式:
格局与格局变换
2.分析表
3.驱动器(模拟算法)
4.SLR分析表的构造
5.LR(文法、语言、分析器)
☆改变格局的动作:
1.移进(shift):
当前剩余输入的下一终结符进栈。
2.归约(reduce):
将栈顶句柄替换为对应非终结符(最左归约)3.接受(accept):
宣告分析成功4.报错(error):
发现语法错误,调用错误恢复例程
(2)LR分析
a)LR分析与LR文法
LR分析:
允许左递归,但不能有二义
定义3.15若为文法G构造的移进-归约分析表中不含多重定义的条目,则称G为"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 知识点