四川大学编译原理复习要点Word格式文档下载.docx
《四川大学编译原理复习要点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《四川大学编译原理复习要点Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
【遍】编译器发现,在生成代码之前多次处理整个源程序很方便,这些重复就是遍。
首遍是从源中构造一个语法树或中间代码,在它之后的遍是由处理中间表示、向它增加信息、更换结构或生成不同的表示组成
二、解释器和编译器的区别与联系?
读入源语言后,解释器和编译器都要进行词法分析、语法分析和语义分析,之后,二者开始有所分别。
解释器在语义分析后选择了直接执行语句;
编译器在语义分析后选择将将语义存储成某一种中间语言,之后通过不同的后端翻译成不同的机器语言(可执行程序)
编译器是把源语言(如C,Pascal,java等高级语言)转换为目标语言(汇编语言、机器语言等低级语言),要产生目标代码。
解释器是以一个源语言(C,Pascal,java等高级语言)为输入,一边解释一边执行源程序,但不产生目标代码。
3、算法描述(伪代码)p41
构造一个扫描程序的自动过程:
正则表达式tNFAtDFAt程序
1、正则表达式tNFA
(1)建立字母表。
输入的正则表达式由于一般不输入“与”操作符,因此
首先给表达式加入•作为与操作。
再利用逆波兰式的堆栈操作,把操作符与字母分开,便得到了字母表。
(2)Thompson构造法。
首先将构成正则表达式的各个元素分解,对于每
一个元素,按照下述规则1和规则2生成NFA。
注意:
如果r中记号a出现了多次,那么对于a的每次出现都需要生成一个单独的NFA。
2、NFAtDFA
从单个输入字符的某个状态中去除£
-转换和多重转换。
(1)利用£
-closure规则即闭包规则,把NFA状态划分成集合,而后把每个集合作为DFA的状态。
详细描述:
从NFA的状态S开始经过£
到达的状态存储下,然后再把存储结果中的状态有经过£
到达的新状态也存储在一起,这样通过闭包规则就可以这些集合,再把集合作为DFA的状态。
(2)子集构造
3、DFAt程序DFA状态最小化取出DFA状态中的不可达的状态。
构造最小状态的等价DFA的算法是通过创建统一到单个状态的状态集来进行。
构造NFA(使用Thompson结构):
1)基本正则表达式基本正则表达式格式a或£
,其中a表示字母表中单个字符的匹配,
£
表示空串的匹配。
与正则表达式a等同的NFA(即在其语言中准确接受)的是:
2)并置我们希望构造一个与正则表达式rs等同的NFA,其中r和s都是正则表达
式。
可将与rs对应的NFA构造如下:
3)在各选项中选择我们希望在与前面相同的假设下构造一个与r|s相对应的N
FA。
如下进行:
4)重复我们需要构造与r*相对应的机器,现假设已有一台与r相对应的机器。
那么就如下进行:
构造NFA的一个例子:
例:
根据Thompson结构将正则表达式ab|a翻译为NFA。
首先为正则表达式a和b分别构造机器:
|r-2-611II'
llionipsotil:
hl」:
|F-'
!
0aba
将NFA转换成DFA(最小子集法):
&
-闭包(&
-closure)是可由e转换从某状态或某些状态达到的所有状态集合,
它总是包含状态本身
子集构造相关题目:
2.1,2.12,2.16
四、提左因子和消除左递归
1、在建立LL⑴语法分析器的时候,提左因子和消除左递归的目的、原因目的:
提取左因子---避免程序回溯;
消除左递归---消除无限循环
原因:
当有公因子存在时,不能立即区分出文法规则右边的选择;
当有左递归时,将导致一个无限循环。
2、提左因子和消除左递归的算法描述消除左递归伪代码P119
fori:
=1tomdo
forj:
=1toi-1do
replaceeachgrammerrulechoiceoftheformAi—Aj3bytherule
Ai—a13|a23|....|ak3,whereAj—a1|a2||akis
thecurrentruleforAj
remove,ifnecessary,immediateeftrecursioninvolvingAi
a)把直接左递归改写为右递归【简单直接左递归】
设有文法产生式:
A—A3|丫。
其中3非空,丫不以A打头。
可写为:
A—yA'
A'
—3A'
|£
一般情况下,假定关于A的产生式是【普遍的直接左递归】
A—Aa1Aa2I…|Aam|31132|…|3n
其中,ai(1wiwm)均不为空,3j(1wjwn)均不以A打头。
A—3
1A'
|
3
2A'
|-|
nA'
—a1A'
a2A'
|…
am
则消除直接左递归后改写为:
'
|&
例4.12:
有文法G(E):
E—E+T|T
T—T*F|F
F—i|(E)
消除该文法的直接左递归。
解:
按转换规则,可得:
E—TE'
E'
t+TE'
LFT'
T'
t*FT'
Fti|(E)
b)消除间接左递归【一般的左递归,不带有&
产生式且不带有循环的文法】
对于间接左递归的消除需要先将间接左递归变为直接左递归,然后再按a)清除左递归。
例4.13:
以文法G6为例消除左递归:
(1)AtaB
(2)AtBb
(3)BtAc
⑷BTd
解:
用产生式
(1),
(2)的右部代替产生式(3)中的非终结A得到左部为]|b的产生式:
(1)BtaBc
(2)BtBbc
(3)BTd
消除左递归后得到:
BtaBcB'
|dB'
B'
tbcB'
|&
再把原来其余的产生式AtaB,ATBb加入,最终得到等价文法为:
(1)
⑵
⑶
⑷
AtaB
AtBb
Bt(aBc|d)B'
tbcB'
c)
消除文法中一切左递归的算法设非终结符按某种规则排序为
消除A中的一切直接左递归
end
提取左因子伪代码P122
当两个或更多文法规则选择共享一个通用前缀时,需要提取左因子:
ATap|aY
按如下规则提取左因子:
ATaA'
5、first集合follow集合算法伪代码P126P131
具体看书上的例子
First集合求法:
1.直接收取:
对形如U—a…的产生式(其中a是终结符),把a收入到First(U)中
2.反复传送:
对形入U—P…的产生式(其中P是非终结符),应把First(P)中的全部内容传送到First(U)中。
Follow集合求法:
注意产生式右部的每一个形如“…Ua…”的组合,把a直接收入到
Follow(U)中。
2.直接收取:
对形如“…UP…”(P是非终结符)的组合,把First(P)除£
直接收入到Follow(U)中。
3.反复传送:
对形如P—…U的产生式(其中U是非终结符),应把Follow(P)中的全部内
容传送到Follow(U)中。
(或P—…UB且First(B)包含则把First(B)除£
直接收入到Follow(U)中,并把Follow(P)中的全部内容传送到Follow(U)中)
6、写递归下降子程序伪代码P106
递归下降:
将一个非终结符A的文法规则看作将识别A的一个过程的定义一个if语句(简化了的)文法规则是:
if-stmt—if(exp)statement
|if(exp)statementelsestatement
伪代码:
procedureifstmt;
begin
match(if);
match(();
exp;
match());
statement
iftoken=elsethen
match(else;
endif;
endifstmt;
p44
给出基于DFA进行词法分析的表驱动的实现算法
state:
=1;
ch:
=nextinputcharacter;
whilenotaccept[state]andnoterror(state)do
newstate:
=T[state,ch];
ifadvance[state,ch]thench:
=nextinputchracter;
State:
=newstate
endwhile;
ifaccept[state]thenaccpet;
7、上下文无关文法BNFEBNF最左最右推导
1定义:
上下文无关文法G是一个四元组G=(N,T,P,S),其中
N是非终结符的有限集合;
T是终结符或单词的有限集合,它与N不相交;
P是形如AF的产生式的有限集合,其中A€N,a€V*,V=TUN
S是N中的区分符号,称为开始符号或句子符号。
V中的符号称为文法符号,包括终结
符和非终结符。
2、Backus-Naur符号(就是众所周知的BNF或Backus-NaurForm)是描述语言的形式化的数学方法,由JohnBackus(也许是PeterNaur)开发,用于描述Algol60编程语言的语法。
3、EBNF(扩展的BNF)使用花括号{…[表示重复,方括号[…]表示可选
EBNF中注意重复和可选的表示方法,语法图【可视的表示EBNF规则的图形表示法】上下文无关文法说明程序设计语言的语法结构,利用了与正则表达式中极为类似的命名惯例和运算。
二者的主要区别在于上下文无关文法的规则是递归的(recursive)
最左推导(leftmostderivation)是指它的每一步中最左的非终结符都要被替换的推导
最右推导(rightmostderivation)则是指它的每一步中最右的非终结符都要被替换的推导。
最左推导和与其相关的分析树的内部节点的前序编号相对应;
最右推导则和后序编号相对应最右推导的一个例子:
expTexpopexp|(exp)|numberopT+|-|*exp=?
e^popexp
=*fxpqpxjumbar
=exp*aufitern{exp)*uundi«
z-3(expop即)“ausber=*(#¥
呼nunbex}*aLULb«
jrr(伴p-jjuwgjj*J3us2»
rf(JiiDBfxr-nunbtfjr)*number
图41尊用衆达式U4-斗性2的推导
分析树与抽象语法树有什么不同?
对一个串按照某种文法进行推导的过程,可以用一颗树表示出来,这棵树
就是分析树。
分析树是表示记号串结构的一种十分有用的方法。
抽象语法树是真正的源代码记号序列的抽象表示,包含了转换所需的所有信息,而且比分析树效率更高。
分析程序可以通过一个分析树表示所有步骤,但却通常只能构造出一个抽象的语法树(或与它等同的)。
8记号类型
1保留字,女口IF何THEN,它们表示字符串“if”和“then”
2、特殊符号,如算数符号加(PLUS)和减(MINUS),它们表示“+”“—
9、语言、句子、句型
【语言】由推导从exp中得到的所有记号符号的串集是被表达式的文法定义的语言
【句型】从文法起始符号出发经过任意有限次推导出来的串
【句子】的只有终结符的串
10、自顶向下(第4章)自底向上(第5章)
区别:
自顶向下语法分析:
从文法的开始符号出发,从顶部开始构造语法分析树。
自底向上语法分析:
从构成语法分析树的叶子节点的终结符号串开始,从底部开始构造语法分析树。
1自顶向下的分析算法通过在最左推导中描述出各步骤来分析记号串输入
自顶向下的分析程序有两类:
回溯分析程序、预测分析程序。
两类自顶向下分析的算法:
递归下降分析、LL
(1)分析。
LL
(1):
第一个L指的是由左向右的处理输入,第2个L指的是为输入串描绘一个最左推
导,括号里的1表示仅使用输入中的一个符号来预测分析的方向。
P106112递归下降:
将一个非终结符A的文法规则看作将识别a的一个过程的定义
First集合follow集合
LL
(1)文法的判断及分析表
2、自底向上语法分析:
从构成语法分析树的叶子节点的终结符号串开始,从底部开始构造语法分析树。
自底向上分析法也称移进-规约分析法。
思想:
对输入串自左向右进行扫描,并将输入符逐个移入栈中,边移入边分析,一旦栈顶符号形成某个句型的句柄或可规约串时,就用产生式左部的非终结符代替之;
这称为一步规约。
最普通的自底向上算法称作LR
(1)分析:
L表示自左向右处理输入,R表示生成了最右推导
SLR
(1)分析是对LR
(1)分析的改进
LALR
(1)比SLR
(1)略微强大且比一般的LR
(1)简单
P153LR(0)项目的DFA
自底向上的分析程序有两种可能的动作(除“接受”之外):
1)将终结符从输入的开头移进到栈的顶部。
2)假设有BNF选择A^a,将栈顶部的串a归约为非终结符A。
11、综合题
1、编写正则表达式
2、给定程序,最左、最右推导,画分析树和抽象语法树
3、正则表达式,NFA,DFA之间的转换;
DFA最小化;
DFA用伪代码表示出来。
4、二义性文法可生成带有两个不同分析树的串的文法称作二义性文法改二义性文法:
基本步骤:
把出现二义的部分优先级分块。
然后每个优先级用一个新的VN表示。
最底优先级的VN符号要能由VT符号定义如:
At…|a
5、给定文法写递归下降分析,写DFA表驱动算法
6、给定文法,提取左因子,消除左递归;
构造first、follow集合;
说明语法是否为LL
(1):
若满足以下条件,则BNF中的文法就是LL
(1)文法:
1)在每个产生式A—X1|X2|….|Xn中
对于所有的i和j:
1三i,j三n.izj,first(X)Afirst(X)为空;
2)若对于每个非终结符A都有first(A)包含了「那么first(A)Afollow(A)为空
构造LL
(1)分析表;
写出分析过程
7、给定文法,构造LR(0)项目的DFA;
构造SLR
(1)的分析表;
文法是否为SLR
(1)或LR(0)?
若不是,说明原因;
给出SLR
(1)或LR(0)的分析步骤