编译原理 复习资料Word文档下载推荐.docx
《编译原理 复习资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《编译原理 复习资料Word文档下载推荐.docx(88页珍藏版)》请在冰豆网上搜索。
左圆括号(
3)界符:
右圆括号)
4)界符:
左大括号{
5)保留字:
int
6)标识符:
x
7)运算符:
=
8)常数:
10,界符:
,
9)标识符:
y
10)界符:
;
11)界符:
右大括号}
2、语法分析
根据语言的语法规则对单词符号串(符号序列)进行语法分析,识别出各类语法短语(可表示成语法树的语法单位),判断输入串在语法上是否正确。
单词序列
语法分析后的单词序列
3、语义分析
任务:
按语义规则对语法分析器归约出的语法单位进行语义分析,审查有无语义错误,为代码生成阶段收集类型信息,并进行类型审查和违背语言规范的报错处理。
输入:
输出:
语义分析后带语义信息的单词序列
4、中间代码生成(并非所有的编译程序都包含此阶段)
将语义分析得到的源程序变成一种结构简单、含义明确、易生成、易翻译成目标代码的内在代码形式。
常用的中间代码形式是四元式(算符,运算对象1,运算对象2,结果)。
语义分析后的单词序列
中间代码
5、代码优化(可放到目标代码生成阶段后)
对中间代码或目标代码进行变换改造等优化处理,使生成的代码更高效。
中间代码或目标代码
优化后的中间代码或目标代码
6、目标代码生成
将中间代码生成特定机器上的绝对或可重定位的指令代码或汇编指令代码。
语义分析后的单词序列或优化后的中间代码
目标代码
二、编译程序结构
上述六个阶段的任务分别由六个模块来完成。
一个完整的编译程序还应包括表格管理和出错处理程序。
典型编译程序结构框图如下:
三、编译阶段的组合
1、前后端组合法
编译前端:
与源语言有关与目标机无关的部分(第1-4阶段)。
编译后端:
与目标机有关的部分(第6阶段)
注:
第5阶段置前或后端都可以。
组合方式:
1)同一源语言的编译前端+不同后端=不同机器上同一源语言的编译程序;
2)不同源语言的编译前端生成同一种中间语言+使用共同后端=同一机器上不同语言的编译程序。
2、遍组合法
遍/趟:
对源程序或源程序的中间结果从头到尾扫描一次称为一遍。
每一遍扫视完成一个或几个阶段的工作。
一个编译程序可由一遍或多遍完成.实际编译程序分遍的主要参考因素是源语言与目标机器的特征。
1.3编译技术和软件工具
一、编译技术的发展
1950S早期:
算术工式译成机器代码。
1950S中期:
FORTRAN编译系统。
1950S末期:
自动生成工具出现,如:
LEX、YACC。
1960S:
自展技术。
1971年:
用自展技术生成PASCAL编译程序。
现代:
并行编译技术。
二、编译技术与软件工具
1、先进的软件开发技术和软件工具能提高编程效率、缩短调试时间。
2、编译程序本身是一种软件工具。
3、大部分软件工具的开发常用到编译技术和方法。
4、进行源程序处理的软件工具实质上都在不同程度上用到了编译程序各个部分的技术和方法。
如:
(1)语言结构化编辑器(语法);
(2)语言程序调试工具(语法、语义);
(3)语言程序测试工具(静、动态测试,发现错误);
(4)高级语言之间的转换工具;
(5)程序格式化工具、程序理解工具等。
1.4程序设计语言规范
从支持的计算模式来看,程序设计语言(是指书写计算机程序的高级语言)规范有如下几种:
1、强制命令式语言,即过程式语言
该型语言中,一个过程可看作是一系列动作,其动作由命令驱动,以语句形式表示,一个语句接一个语句的执行。
属于这种规范的语言如PASCAL、C、FORTRAN等,C++、Ada、COBOL等也支持这种模式。
本课程介绍的编译技术针对这型语句。
2、函数式语言,即应用式语言
该型语言注重程序所表示的功能,程序的开发过程是从前面已有函数出发构造出更加复杂的函数,对初始数据集进行操作,直到最后形成的函数可以得到最终结果。
属于这种规范的语言如ML、LISP等。
3、基于规则(逻辑)的语言
该型语言程序的执行过程是检查一定的使能条件,满足时,则执行适当的动作。
如逻辑程序设计语言PROLOG,其基本的使能条件是某种谓词逻辑表达式;
再如YACC,其使能条件是程序的形式语法(BNF)。
4、面向对象语言
该型语言的主要特点是提供抽象数据类型,支持封装性、继承性和多态性。
C++、Ada、Java等也支持这种模式。
1.5编译程序的构造
一、编译程序的构造途径
1、用某种程序语言编写;
2、用编译程序自动构造工具构造。
3、通过现有的编译基础设施进行改造和组装。
二、T型图
T型图是用来表示一个编译程序所涉及到的三个方面的语言的一种工具,将源语言S通过用语言H书写的编译器翻译成目标语言T的编译程序可用如下T型图THST表示。
T型图的两种组合方式:
三、编译程序的自展
1、方法:
用“滚雪球”的方式生成编译程序。
2、思想:
先用目标机的汇编语言或机器语言书写源语言的一个子集的编译程序,再用这个子集作为书写语言(属于高级语言),实现源语言的编译程序。
例:
设,目标机A的语言为A,则两层自展构造实现语言C对应A机器的编译程序过程可描述为如下:
其自展过程:
用语言A编写语言C1的编译程序TAC1A;
再用C1书写语言C的编译程序TC1CA;
最后再将TC1CA经过TAC1A编译得到TACA。
四、编译程序的移植、自编译、交叉编译
1、移植:
将某一机器(宿主机)上已有的软件移植到另一机器(目标机)上的过程。
2、自编译:
用某种语言本身书写自己的编译程序的过程。
例如:
在机器A上已有语言C的编译程序(将语言C翻译成A的机器码A),现希望利用此编译程序生成机器B上的语言C的编译程序(将语言C翻译成B的机器码B)。
3、交叉编译:
把某源语言在宿主机上经过编译而产生目标机的汇编语言或机器语言的过程。
五、可重定向编译程序
1、由于交叉编译是在一个平台上生成另一个平台上的可执行代码的过程。
交叉编译受限较多。
2、编译基础设施:
为开发各种编译程序成分提供相应生成工具。
3、可重定向编译程序:
能够根据不同的目标机生成相应目标代码的编译程序。
它将与目标机相关的部分单独编写成不同模块,根据不同的目标机调用不同的模块。
自由软件GCC(GNU工程的编译程序集合)是目前使用广泛的可重定向编译程序。
4、支持可重定向编译的关键技术
1)中间表示技术:
区别于四元式等传统的中间表示,支持可重定向编译的中间表示应在适当的抽象层次上,向上能够支持多语言映射、向下能够适应多平台转换后宜于进行各种优化。
2)机器描述技术:
区别于传统的假定式体系结构抽象模型的描述技术,支持可重定向编译的机器描述机制应能描述系统和硬件的共性,又能描述它们各自的特性,且能适应于不同编译程序的处理。
研究表明,基于体系结构描述语言详细地指定了体系结构是产生高质量机器级工具的关键技术。
3)代码生成程序的构造技术:
为简化开始过程、提高代码可靠性,支持代码生成程序的自动构造工具是关键技术和主要难点。
4)目标机描述与目标代码生成的接口技术:
在重定向编译程序的开始过程中,抽取一系列函数和数据结构作为目标机描述与目标代码生成的接口可以简化编译程序的开发,提高编译程序的效率。
2
使学生了解文法的直观描述、符号和符号串,掌握文法和语言的形式定义、文法的分类。
教学重点:
文法和语言的形式定义、文法的分类
教学难点:
文法和语言的形式定义
2学时
第三章文法和语言
3.1语言概述和文法的直观概念
一、基本概念
1、语言:
是由句子组成的集合,是由一组符号所构成的集合。
2、汉语:
所有符合汉语语法的句子的全体。
3、英语:
所有符合英语语法的句子的全体。
4、程序设计语言:
所有该语言的程序的全体。
二、语言研究的内容
1、语法(Syntax):
每个句子构成的规律/每个程序构成的规律。
表示构成语言句子的各个记号之间的组合规律。
在形式语言理论中,阐明语法的工具是文法。
2、语义(Semantics):
每个句子的含义/每个程序的含义。
表示各个记号的特定含义。
(各个记号和记号所表示的对象之间的关系)。
3、语用(Pragmatics):
每个句子和使用者的关系/每个程序和使用者的关系。
表示在各个记号所出现的行为中,它们的来源、使用和影响。
三、文法的直观描述
通常,用句子表述一种语言,但是句子是无穷的。
1、例子
以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,比如汉语句子可以是由主语后随谓语而成,构成谓语的是动词和直接宾语。
下面采用EBNF来表示句子的构成规则。
先给定如下一组规则:
〈句子〉∷=〈主语〉〈谓语〉
〈主语〉∷=〈代词〉|〈名词〉
〈代词〉∷=我|你|他
〈名词〉∷=王明|学生|工人|英语
〈谓语〉∷=〈动词〉〈直接宾语〉
〈动词〉∷=是|学习
〈直接宾语〉∷=〈代词〉|〈名词〉
有了这一组规则后,用它们导出句子的方式如下:
1)找∷=左端的带有〈句子〉的规则并把它由∷=右端的符号串代替,这个动作表示成:
〈句子〉⇒〈主语〉〈谓语〉
2)在得到的串〈主语〉〈谓语〉中,选取〈主语〉或〈谓语〉,再用相应规则的∷=右端代替之。
比如:
选取了〈主语〉,并采用规则〈主语〉∷=〈代词〉,那么得到:
〈主语〉〈谓语〉⇒〈代词〉〈谓语〉,
3)重复上述步骤。
导出句子:
“你是学生”的全部动作过程是:
〈句子〉⇒〈主语〉〈谓语〉⇒〈代词〉〈谓语〉⇒你〈谓语〉⇒你〈动词〉〈直接宾语〉⇒你是〈直接宾语〉⇒你是〈名词〉⇒你是学生
因此,“你是学生”的构成符合上述规则,而“你学生是”不符合上述规则,因此,它不是句子。
2、文法的直观定义
上例中的规则就是我们判别句子结构合法与否的依据,可以将这些规则看成是一种元语言,用它描述汉语。
由此可得文法的直观定义如下:
文法:
就是这样一些规则的有穷集合,它是以有穷规则集来刻划无穷句子集合的工具。
3.2符号和符号串
1、字母表:
元素的非空有穷集,记为Σ。
2、符号:
字母表中的元素。
3、符号串:
符号的有穷序列。
4、空符号串:
什么符号也不含的符号串,记为ε。
Σ={a,b,c,d,……z}。
a、b、c……都称为符号。
hello、stri、aezfg、main、fjfka都是Σ上的符号串。
二、符号串的基本操作
1、符号串的长度:
符号所包含符号的个数,设x是一符号串,其长度记为|x|。
例:
|hello|=5,|main|=4,|ε|=0。
2、符号串的连接:
设x、y是两个符号串,则xy被称为x与y的连接。
特别有:
x=xε=εx=εxε
x=my,y=classmate,则xy=myclassmate。
3、符号串的方幂:
设x是符号串,x自身的连接称为符号串的方幂,有:
x=ba,x0=ε,x1=ba,x2=bababa
4、符号串的集合:
若集合A中元素都是某字母表Σ上的符号串,则A是Σ上的符号串集合。
5、符号串集合的乘积:
若A、B均为Σ上的符号串集合,则AB={xy|x∈A,y∈B}
设A={ab,cd},B={ef,jh},则AB={abef,abjh,cdef,cdjh}
A{ε}=A,φA=Aφ=φ。
6、符号串集合的正闭包:
设符号串集合A,A的正闭包记为A+,A的闭包记为A*。
设Σ={0,1},则Σ+={0,1,00,01,10,11,000,001……}。
Σ*={ε,0,1,00,01,10……}。
3.3文法和语言的形式定义
1、产生式
设VN,VT分别是非空有限的非终结符号集和终结符集。
V=VN∪VT,VN∩VT=φ。
所谓产生式是一个序偶对(α,β),其中α∈V+,β∈V*,通常表示为:
α→β或α∷=β,产生式也叫规则、重写规则、生成式。
<
阿拉伯数字>
→0|1|2|3…|9
2、文法
文法G是一个四元组,G=(VN,VT,P,S)。
其中:
VN,VT分别是非空有限的非终结符集和终结符集,且二者交集为φ;
P为产生式集;
S∈VN,是文法的开始符号(或识别符),它是一个非终结符,至少要在一条规则中作为左部出现。
文法G=(VN,VT,P,S),其中VN={S,B},VT={0,1},P={S→0B,B→1,B→1B}。
开始符为S。
可用文法的通俗表示法表示如下:
G[S]:
S→0B,B→1,B→1B
这个文法表示所有形如01,011,0111,01111的串。
3、直接推导
设α→β是文法G=(VN,VT,P,S)的产生式,γ,δ∈(VN∪VT)*,若有符号串v,w满足v=γαδ,w=γβδ,则称w是v的直接推导,或称v是w的直接归约。
记作v=>
w。
现有文法G[E]:
E→E+T|TT→T*F|FF→(E)|i
设v=E+F*i,w=E+i*i,则有v=>
w或E+F*i=>
E+i*i。
4、推导
如存在一直接推导序列v=>
α0=>
α1=>
α2....=>
αn=u(n>
0),则称符号串u为符号串v的一个推导(或者说v是u的一个归约),记为v=+>
u;
若有v=+>
u,且有v=u,则记作v=*>
u。
对于上例中文法G[E]:
E→E+T|TT→T*F|FF→(E)|i
设v=E,u=i+i*i,则有:
v=+>
相应的直接推导序列为:
E=>
E+T=>
E+T*F=>
E+F*F=>
T+F*F=>
F+F*F=>
F+F*i=>
F+i*i=>
i+i*i
5、句型和句子
设G[S]是一文法,如有S=*>
x,则称x是文法G[S]的句型。
若x是G[S]的句型,且x∈VT*,则称x是G[S]的句子。
6、语言
文法G[S]的语言是G[S]的所有句子构成的集合。
即L(G)={x|S=*>
x,且x∈VT*}。
文法G[S]:
S→MVDM→小王|小张V→是|不是D→大学生
则文法G[S]表示的语言可定义为:
L(G)={小王是大学生,小王不是大学生,小张是大学生,小张不是大学生}
MVD,M是D,M是大学生等均是G[S]的句型。
7、文法的等价
若L(G1)=L(G2),则称G1和G2是等价的。
3.4文法的类型
Chomsky将文法按其所表示的语言的表达能力,由高往低分为四类:
0型,1型,2型,3型文法。
一、定义
(1)0型文法
如果文法G的产生式α→β,其中α∈(VN∪VT)*,且至少含有一个非终结符号,β∈(VN∪VT)*。
则称G为0型文法。
0型文法又称短语结构文法。
(2)1型文法
如果0型文法G的产生式α→β满足|β|>
=|α|,仅当β=ε时例外。
则称此文法G是1型文法。
1型文法也称上下文有关文法。
(3)2型文法
一个1型文法G,如果满足α∈VN,则称为2型文法。
或者说2型文法的产生式都形如A→β。
2型文法也称上下文无关文法。
(4)3型文法
一个2型文法G,如果产生式全都是形如A→a或A→aB,其中:
A、B∈VN,a∈∪VT*,则G为3型文法。
3型文法也称正则文法或正规文法或右线性文法。
它对应有穷自动机。
(5)四类文法产生对应的四类语言。
二、文法之间的关系
四类文法的定义是通过逐步增加限制条件进行的。
即有:
3型文法⊂2型文法⊂1型文法⊂0型文法。
三、例题
判断下列文法类型:
例1:
S→aSYZS→aYZaY→ayyY→yyyZ→yzZY→YZzZ→zz
0,1
例2:
S→xSYZS→xYZxY→xyY→yyyZ→yzZY→YZzZ→zz
例3:
S→aTT→bT|cT|b|c
0,1,2,3
例4:
S→xB|cB→AzA→cS
3
使学生掌握语法树的构造、句型分析的方法,了解二义性文法的改造和有关文法实用性的一些说明。
句型分析
二义性文法的改造、句型分析
3.4上下文无关文法及语法树
上下文无关文法有足够的能力来描述现今程序设计语言的语法结构。
今后如无特别说明,“文法”一词均指上下文无关文法。
一、语法树
语法树也称推导树,给定文法G=(VN,VT,P,S),对于文法G的任意一个句型都存在一个相应的语法树,它满足:
(1)树中每一个结点都有一个标记,此标记是V=VN∪VT中的一个符号。
(2)根的标记是S。
(3)苦树的一结点A至少有一个子女,则A∈VN。
(4)如结点A的子女结点从左到右次序为B1,B2...Bn,则必有产生式A→B1B2...Bn。
S→aAS|a
A→SbA|SS|ba
对句型aabbaa的推导过程可表示为下图所示语法树。
下面两个推导过程均可由上图表示。
(1)S⇒aAS⇒aSbAS⇒aabAS⇒aabbaS⇒aabbaa
(2)S⇒aAS⇒aAa⇒aSbAa⇒aSbbaa⇒aabbaa
这说明同一语法树可以表示对同一句型不同的推导过程。
二、最左(右)推导
1、如果每一步α⇒β中,都是对α中最左(右)非终结符进行替换,则称之为最左(右)推导。
2、最右推导称为规范推导,由规范推导所得的句型称为规范句型。
3、同一语法树最多对应唯一的最左(右)推导。
4、一个句型有可能对应着不同的语法树。
文法G[E]:
E→i|E+E|E*E|(E),则句型i*i+i可能对应着下面两个最右推导:
(1)E⇒E+E⇒E+i⇒E*E+i⇒E*i+i⇒i*i+i
(2)E⇒E*E⇒E*E+E⇒E*E+i⇒E*i+i⇒i*i+i
三、二义性语法树
1、如果一个文法存在某个句子对应着两棵不同的语法树,则称此文法是二义的。
不存在一种算法能在有限步骤内判断一个2型文法是否是二义的。
2、实际应用中,常找出一组无二义性的充分条件来构造无二义性文法。
3、例子
下列简单算术表达式的文法是二义性文法。
E→E+E|E-E|E*E|E/E|(E)|id
引入新的非终结符后可变换为非二义性文法。
E→E+T|E-T|TT→T*F|T/F|FF→(E)|id
If语句的文法G[S]:
S→ifEthenSS→ifEthenSelseSS→EE→a≠0|a>
0|b=1|b=-1|b=0
假设执行下列语句前b=0,有If句子:
ifa≠0thenifa>
0thenb=1elseb=-1
则当a=1时,b=1;
当a=-1时,b=-1;
当a=0时,b=0。
通过引入新非终结符、加ε规则进行改造后得文法:
(1)S→U|M|E
(2)U→ifEthenS(3)U→ifEthenMelseU(4)M→ifEthenMelseM
(5)M→S(6)M→ε(7)E→a≠0|a>
课堂作业:
为上述改造前和和改造后的文法构造唯一的语法树。
3.6句型的分析
句型的分析就是识别一个符号串是否为某文法的一个句型。
本课程介绍的分析算法都是从左到右的分析算法。
它们分为两大类:
自顶向下分析、自底向上分析
一、自顶向下分析
自顶向下分析:
由根向下逐步建立语法树,是一个逐步推导的过程。
S→cAdA→ab|a
对输入串cabd进行识别过程为:
S⇒cAd⇒cabd,构造语法树步骤如图所示:
识别过程也有可能是S⇒cAd⇒cad,此时无法识别出串cabd,需要回溯。
二、自底向上分析
自底向上分析:
自叶向上构造语法树,是一个逐步约的过程。
自底向上分析法的核心在于寻找“可归约串”。
对串cabd归约过程为cabd⇐cAd⇐S,构造语法树步骤如图所示:
归约过程也有可能是cabd⇐cAbd,此时无法识别出串cabd,也需要回溯。
三、句型分析的有关问题
1、基本概念
(1)令G[S]是一文法,αβδ是文法G的一个句型,如果有:
S=*>
αAδ,且A=+>
β,则称β是句型αβδ相对于非终结符A的短语,如有A⇒β,则称β是αβδ相对于非终结符A或相对于规则A→β的直接短语(也叫简单短语)。
(2)一个句型的最左直接短语称为该句型的句柄。
注意:
作为短语的β必须是需要分析的句型αβδ的一部分。
2、例子
已知文法G[E]:
E→E+T|TT→T*F|FF→(E)|i
对于给定的句型i*i+i,指出该句型的所有短语、直接短语和句柄。
解:
将句型改写为i1*i2+i3,则:
1)因E=+>
i1*i2+i3,E=+>
i1*i2,故句型相对于E的短语有:
i1*i2+i3,i1*i2。
2)因T=+>
i1*i2,T=+>
i1,T=+>
i3,故句型相对于T的短语有i1*i2,i1,i3。
3)因F=+>
i1,F=+>
i2,F=+>
i3,故句型相对于F的短语为:
i1,i2,i3;
且i1,i2,i3均为句型相对于规则F→i的直接短语,其中i1为句柄。
下面根据语法树进行分析:
例2:
G[S]:
S→aASS→aA→SbAA→SSA→ba