编译原理考试.docx
《编译原理考试.docx》由会员分享,可在线阅读,更多相关《编译原理考试.docx(54页珍藏版)》请在冰豆网上搜索。
![编译原理考试.docx](https://file1.bdocx.com/fileroot1/2023-8/16/d0228045-55a8-4533-bbed-5b70449b8446/d0228045-55a8-4533-bbed-5b70449b84461.gif)
编译原理考试
编译程序是对高级语言程序进行翻译
在规范规约中,用句柄来刻画可规约串
动态存储分配是指在运行阶段为源程序的数据对象分配存储空间
词法分析的输出结果是单词的种别编码和自身值
正规式等价是指所识别的语言集相等
优化可生成运行时间短且占内存少的代码程序
【一】文法和语言
编译程序和翻译程序的区别
编译程序是整体编译完了,生成目标代码,再一次性执行。
解释程序是一边解释,一边执行,并不形成目标程序。
文法
文法是描述语言的语法结构的形式规则(即语法规则)。
文法G:
定义为四元组(VN,VT,P,S)VN为非终结符号的集合,VT为终结符号的集合,P为产生式的集合,S为开始符号,是一个非终结符,至少要在一条规则中作为左部出现。
文法分类
0型文法短语文法递归可枚举语言
1型文法上下文有关文法上下文有关语言
2型文法上下文无关文法上下文无关语言
3型文法正规文法正规语言
句型
假定G是一个文法,S是它的开始符号。
如果S*(表示从S出发,经0步或若干步可推出),则称是一个句型。
句子
仅含终结符号的句型是一个句子。
语言
由文法G生成的语言记为L(G),它是文法G的一切句子的集合
推导直接推导
规约直接规约
直接推导:
仅当A—>γ是一个产生式,有v=αAβ,w=αγβ,αAβαγβ,称v直接推导到w,记作vw,也称w直接归约到v。
最左推导又称为规范推导。
语法树
语法树的根结由开始符号所标记。
随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结。
每个新结和其父亲结间都有一条连线。
在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。
二义文法
如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。
也就是说,若一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是法是二义的。
文法的二义性证明:
找出一个句子,它有两个不同的最左推导或最右推导
画出语法树
E→E+E|E*E|(E)|i, 关于(i*i+i)的语法树
短语
语法树中一棵子树的所有叶子从左向右排列起来形成一个相对于子树根的短语。
直接短语
只有父子两代的短语为直接短语。
句柄
一个句型的分析树中,最左边的只有父子两代的子树的叶子从左向右排列起来形成构成此句型的句柄。
1、语言和文法的相互转换
1)已知文法写出该文法所生成的语言:
①语言是有穷集:
通过从开始符号的推导出所有的句子,所有句子的集合即为所求的语言
②语言是无穷集:
通过从开始符号的推导出几个的句子,总结句子的特点,将特点描述出来。
例如G:
S→0S1,S→01
S01S0S10011S0S100S11=>000111
语言为01个数相等,并且0在前,1在后L(G)={0n1n|n>=1}
2)已知语言写出描述该语言的文法
一般所写的文法是上下文无关文法和正规文法,
①用集合的形式表示语言
若是这一类的题目先记住几个基本的情况,若是复杂的都可以分解成基本的情况。
一般给定集合是无限集,文法都应是递归文法,可以是直接递归也可以是间接递归。
基本的有:
ⅰ{an}若生成多个a,用递归文法表示则为:
A->aA,
递归有结束的时候,结束的写法看n的值:
若n为0,即有0个a,即为ε,A->ε
若n为1,即有1个a,即为a,A->a
若n为2,即有2个a,即为aa,A->aa
ⅱ{anbn}生成n个a,n个b且a在b之前,则每一次推导都要产生一个a和一个b,才能保证ab的个数相等,若用A作为非终结符,右部A不能在ab之前A->Aab,或在ab之后A->abA,这样生成的符号串就是abab…,所以只能在ab之间。
所以为:
A->aAb,然后看n的值:
若n为0,即有0个ab,即为ε,A->ε若n为1,即有1个a,一个b,即为ab,A->ab
ⅲ{rrt}若r是{a,b}*,rt是r的逆,第一位和最后一位相同,第二位和倒数第二位相同,……。
所以先生成第一个和最后一个,然后依次生成第二位和倒数第二位……。
因为第一位和最后一位相同,同为a或同为b,A->aAa|bAb,这样能保证从后部分是前部分的逆。
递归结束看rt和r之间的符号,在这里没有为ε,所以为A->ε;若改为{rart},rt和r之间为a,即为A->a
其余的情况可分解成以上三种情形。
例1:
试构造生成语言L={anbnci|n≥1,i≥0}的文法
分析:
anbnci可以进行分解让A生成anbn,B生成ci符号串anbnci是AB连接后的结果。
n≥1所以A-〉aAb|ab,i≥0所以B->cB|ε也可写成B->Bc|ε。
解:
S-〉ABA-〉aAb|abB->cB|ε
例2:
已知语言L={anbbn|n≥1},写出产生L的文法。
分析:
先生成anbn,当n=1符号串为:
abb
解:
S-〉aSb|abb
例3:
请给出描述语言={a2m+1bm+1|m>=0}∪{a2mbm+2|m>=0}的文法
分析:
a2m+1bm+1可以看成aa2mbmb,而a2mbm可以用A->aaAb生成,a2mbm+2可以看成a2mbmbb,而a2mbm也可以用A->aaAb生成,若m=0,a2mbm为空串所以为A->ε,aa2mbmb是aAb,a2mbmbb是Abb;
解:
s->aAb|Abb
A->aaAb|ε
例4:
已知语言L={x|x∈{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等)写出该语言的文法。
分析:
若符号串的长度为偶数,则后半部分是前半部分的逆,所以为S->aSa|bSb|cSc|ε
若符号串的长度为奇数,则除中间的外,中间字符的后半部分是中间字符前半部分的逆,而中间的字符可以为a,b,c所以文法为:
S->aSa|bSb|cSc|a|b|c
解:
S->aSa|bSb|cSc|a|b|c|ε
②用自然语言描述语言
这种情况一般常根据经验来构造文法。
例:
写一个文法,使其语言是奇数集,且每个奇数不以0开头。
N->A|MA
M->B|MD
A->1|3|5|7|9
B->1|2|3|4|5|6|7|8|9
D->0|B
1.已知文法G[A]=({A},{a,b},{A—>bA|a},A)所生成的语言是什么?
{bna|n>=0}
2.写一文法,使其语言是偶正整数的集合。
要求:
(1)允许0打头;
(2)不允许0打头。
答:
(1)允许0开头的偶正整数集合的文法
E→NT|D
T→NT|D
N→D|1|3|5|7|9
D→0|2|4|6|8
(2)不允许0开头的偶正整数集合的文法
E→NT|D
T→FT|G
N→D|1|3|5|7|9
D→2|4|6|8
F→N|0
G→D|0
3.给出生成下述语言的上下文无关文法:
(1){anbnambm|n,m>=0}
(2){1n0m1m0n|n,m>=0}
(3){a2n+1|n>=0}
(4){a2n+1bnci|n>0,i>=0}
答:
(1)S→AA
A→aAb|ε
(2)S→1S0|A
A→0A1|ε
(3)S→aaS|a
(4)S→aAB
A→aaAb|aab
B→cB|ε
4.已知语言L={x|x∈{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等)写出该语言的文法。
S→aSa|bSb|cSc|a|b|c|ε
1:
证明下述文法G[E]是二义的。
E→a|(E)|EOE
O→+|-|*|/
答:
可为句子a+a*a构造两个不同的最右推导:
最右推导1E
EOE
EOa
E*a
EOE*a
EOa*a
E+a*a
a+a*a
最右推导2E
EOE
EOEOE
EOEOa
EOE*a
EOa*a
E+a*a
a+a*a
2:
令文法G[E]为:
E→T|E+T|E-T
T→F|T*F|T/F
F→(E)|i
1:
试构造生成语言L={anbnci|n≥1,i≥0}的文法
解:
S-〉ABA-〉aAb|abB->cB|ε
2:
已知语言L={anbbn|n≥1},写出产生L的文法。
解:
S-〉aSb|abb
3:
已知文法G=({A,B,C},{a,b,c},A,P)
其中产生式P由以下组成:
A→abcA→aBbc
Bb→bBBc→Cbcc
bC→CbaC→aaB
aC→aa
问:
此文法表式的语言是什么?
解:
该题通过推导到的句子的特点进行总结,语言为:
{anbncn|n>=1}
4请给出描述语言={a2m+1bm+1|m>=0}∪{a2mbm+2|m>=0}的文法
解:
s->aAb|Abb
A->aaAb|ε
5已知文法G[S]为:
S→dAB
A→aA|a
B→Bb|
G[S]产生的语言是什么?
G[S]能否改写为等价的正则文法?
解:
语言为:
{dambn|m>0,n>=0}
可改写为正规文法:
S->dAA->aBB->aB|bD|εD->bD|ε
6:
试写一文法,使其描述的语言L(G)是能被5整除的整数集合。
解:
S->D|AD|ABD
D->0|5
A->1|2|3|4|5|6|7|8|9
B->0|A|0B|AB
7:
已知语言L={x|x∈{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等)写出该语言的文法。
解:
S->aSa|bSb|cSc|a|b|c|ε
2、已知一上下文无关文法,对给定的句型,画出语法树,并求其所有的短语,直接短语以及句柄。
1)已知一上下文无关文法,构造语法树
语法树是对推导过程中的形象描述。
若用产生式:
A->α推导,对应的树中,A是双亲结点,α中的符号是孩子结点。
一般根据推导过程可以画出语法树。
注意,推导过程有最左推导、最右推导和既不是最左也不是最右推导。
注意:
语法树的叶子结点不一定是终结符号
例:
对于文法G[S]
S→(L)|aS|a
L→L,S|S
画出句型(S,(a))的语法树
S
(L)
L,S
S(L)
S
a
2)求某一句型的短语,直接短语,句柄.
短语:
(S,(a));S,(a);(a);a;S
直接短语:
S;a
句柄:
S
用语法树理解某一句型的短语,直接短语,句柄
语法树中一棵子树的所有叶子从左向右排列起来形成一个相对于子树根的短语。
只有父子两代的短语为直接短语。
一个句型的分析树中,最左边的只有父子两代的子树的叶子从左向右排列起来形成构成此句型的句柄。
所以短语的求法:
根据语法树中的非终端结点来查找短语;
每一个非终端结点为根的子树上的叶子结点从左往右排列起来即是短语。
若某个非终端结点的所有的孩子结点都是叶子结点,该非终端结点为根的子树上的叶子结点从左往右排列起来即是直接短语,也就是所有的孩子结点排列起来即是直接短语。
句柄:
最左直接短语
写出句型(S,(a))的所有短语,直接短语,句柄.
根据该句型的语法树,可以知道有六个非终端结点,对语法树从上到下,从左往右看非终端结点:
以S为根的子树上的叶子结点排列起来为:
(S,(a));以L为根的子树上的叶子结点排列起来为:
S,(a);以L为根的子树上的叶子结点排列起来为:
S;以S为根的子树上的叶子结点排列起来为:
(a);以L为根的子树上的叶子结点排列起来为:
a;以S为根的子树上的叶子结点排列起来为:
a;后两个非终端结点对应相同的叶子结点,所以写成一个短语,所以短语有五个:
所有短语:
(S,(a));S,(a);(a);a;S
第三层上的L和第五层上的S的所有孩子都是叶子,所以所对应的叶子排列起来是直接短语
直接短语:
S;a
句柄:
S
证明E+T*F的语法树,指出这个句型的所有短语、直接短语和句柄。
答
E+T*F的语法树:
E
E+T
T*F
短语有:
E+T*F,T*F
直接短语有:
T*F
句柄为:
T*F
3:
已知文法G:
S→>(AS)|(b)A→(SaA)|(a)
试画出句型(A((SaA)(b)))的语法树,指出该句型的所有短语、直接短语和句柄(8分)
S
(AS)
(AS)
(SaA)(b)
短语:
(SaA)、(b)、((SaA)(b))、(A((SaA)(b)))
直接短语:
(SaA)、(b)
句柄(SaA)
【二】词法分析
正规式:
正规文法:
任一产生式α→β的形式都为:
A→aB或A→a
正规集:
设字母表为,辅助字母表`={,,,,,,}。
1.和都是上的正规式,它们所表示的正规集分别为{}和;
令={a,b},上的正规式和相应的正规集的例子有:
正规式正规集
a{a}
ab{a,b}
ab{ab}
(ab)(ab){aa,ab,ba,bb}
a{,a,a,…任意个a串}
DFA
一个确定的有穷自动机(DFA)M是一个五元组:
M=(K,Σ,f,S,Z)其中
1.K是一个有穷集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号表;
3.f是状态转换函数,是在K×Σ→K上的映射.如f(ki,a)=kj,(ki∈K,kj∈K)
意味着,当前状态为ki,输入符为a时,将转换为下一个状态kj,我们把kj称作ki的一个后继状态;
4.S∈K是唯一的一个初态;
5.ZK是一个终态集,终态也称可接受状态或结束状态。
NFA
一个不确定的有穷自动机(NFA)M是一个五元组:
M=(K,Σ,f,S,Z)其中
1.K是一个有穷非空集,它的每个元素称为一个状态;
2.Σ是一个有穷字母表,它的每个元素称为一个输入符号,所以也称Σ为输入符号表;
3.f是状态转换函数,是在K×Σ*→2K上的映射.
4.SK是初始状态集
5.ZK是一个终态集
NFA到DFA的确定化过程
子集法
1:
NFA确定化和DFA最小化
确定化:
采用的子集法。
1)DFA的初态为:
NFA的初态集的ε-closure,即为ε-closure(S)S为NFA的初态集
2)从ε-closure(S)开始将所有求出的子集均接受Σ上的符号,求出所到达的集合,直到子集不在增大为止。
3)确定终态:
若子集中含有NFA的终态,该子集为DFA的终态
例:
从图中可以得到:
NFA的初态为i终态为f
ε-closure({i})={i,1,2}
状态集合I的ε-闭包,表示为ε-closure(I),除了包括自身之外,还包括状态集I中的任何状态S经任意条ε弧而能到达的状态的集合。
ε-closure({i})要包括自身中的状态i,和i经过任意条ε弧到达的状态,可以到1和2,所以ε-closure({i})={i,1,2}
DFA的初态为:
NFA的初态集的ε-闭包,所以为{i,1,2}
确定化的过程
从{i,1,2}开始,接受a,是:
:
i接受a到达的集合是空集
1接受a到达的集合是{1}
2接受a到达的集合是{3}
Φ∪{1}∪{3}={1,3},然后求{1,3}的ε-闭包,ε-closure({1,3})={1,3,2}
所以{i,1,2}接受a到达的集合是{1,3,2}。
用数学的形式表示为:
{1,2,3}=-closure(move({i,1,2},a))
状态集合I的a弧转换,表示为move(I,a)定义为状态集合J,其中J是所有那些可从I中的某一状态经过一条a弧而到达的状态的全体。
{i,1,2}接受b到达的集合是{1,2,4}。
{1,2,3}和{1,2,4}是新增加的子集,然后在对{1,2,3}和{1,2,4}再分别接受a和b,重复做直到所出现的所有集合都接受了a和b。
如上表所示。
终态的确定:
NFA的终态为f,上面所出现的集合只要有f的即为DFA的终态,{1,2,3,5,6,f}{1,2,4,5,6,,f}{1,2,4,6,f}{1,2,3,6,f}中都含有f所以是终态。
画出DFA的状态转换图:
最小化:
采用的分割法完成:
1.将M的状态分成非终态和终态集
2、寻找子集中不等价状态
若一个集合的状态等价,则对于任何输入符号,该集合中的状态接受该符号后到达的状态属于同一集合。
否则不等价,把不在同一个集合的划分出去。
例上图:
先划分为终态集和非终态集{S,A,B}{C,D,E,F}
对于集和{C,D,E,F}中的状态接受a到达的状态属于同一个集合,属于集和{C,D,E,F},接受b到达的状态属于同一集合,所以C,D,E,F是等价的。
对于集和{S,A,B},S接受a到达的状态为A,属于{S,A,B},A接受a到达的状态为C,属于{C,D,E,F},B接受a到达的状态为A,属于{S,A,B},所以A与S,B是不等价的。
将A划分出去。
划分的结果为:
{A}{S,B}
对于集和{S,B}接受a到达的状态均为A,属于{A};S接受b到达的状态为B,属于{S,B},B接受b到达的状态为D,属于{C,D,E,F},{S,B}接受b到达的状态属于不同集合,所以S,B是不等价的。
最终的划分为:
{S},{A}{B}{C,D,E,F}
将等价的状态合并:
正规文法、正规式和FA的等价问题
2、FA和正规式、正规文法的转化
1)正规文法转化为正规式:
采用的是联立方程组:
例如:
文法G[S]为:
S->aA,S->a,A->aA,A->dA,A->a,A->d
联立方程组为:
S=aA+a
(1)
A=aA+dA+a+d
(2)
整理:
A=(a+d)A+(a+d)
A=(a+d)*(a+d)
带入
(1)S=a(a|d)*(a|d)|a=a(a|d)*
注:
产生式左部相同的写到一个方程中,所有的右部用+连接起来作为方程的右部。
产生式左部作为方程的左部,S->aA,S->a,对应的方程为:
S=aA+a
方程的求解:
若有方程A=rA+t,则该方程的解为:
A=r*t
2)正规式转化为正规文法:
一般用分解法做,记住几个基本的情况:
•若x和y都是正规式,
对A->xy,重写成:
A->xB,B->y;
对形如A->x|y,重写成:
A->x,A->y;
对形如A->x*y,重写成:
A->xA|y
-不断使用如上规则,直到每个产生式最多含有一个终结符为止。
例如:
将R=a(a|d)*转换成正规文法
分解的情况是:
a与(a|d)*做连接,所以为:
A->aB,B->(a|d)*
(a|d)*相当于:
(a|d)*ε按第三种情况处理,所以为:
B->(a|d)B|ε,即为:
B->aB|dB|ε
所以文法为:
A->aBB->aB|dB|ε
3)正规文法转化为FA
a)字母表与G的终结符集相同。
b)为G的每个非终结符生成M的一个状态,G的开始符号S是初态。
c)增加一个新状态Z,作为NFA的终态。
d)对G中的形如A->tB的产生式,其中t为终结符或,A和B为非终结符,构造M的一个转换函数f(A,t)=B;,即A到B有一条弧,弧上的标记为t
e)对G中的形如A->t的产生式,构造M的一个转换函数f(A,t)=Z;即A到Z有一条弧,弧上的标记为t
例如:
G[S]:
S->aAS->bBS->A->aBA->bAB->aSB->bAB->转化为的FA为:
4)FA转化为正规文法:
a)有穷自动机的初态对应文法的开始符号。
b)有穷自动机的字母表为文法的终结符集。
c)对转换函数f(A,t)=B,即A到B有一条弧,弧上的标记为t即可写一个产生式A->tB。
d)对可接受状态Z,增加一个产生式Z->
例如:
正规文法为:
G[A]:
A->aBA->bDB->bCC->aAC->bDC->D->aBD->bD
D->
5)正规式转化为FA
一般采用分解法完成,直到弧上只有一个输入符号或为止
形如xy,:
xy
形如x|y,
x|y
形如A->x*y
Y
X
例:
1(0|1)*101
6)FA转化为正规式:
第一步,在M的状态转换图上加进两个结点,一个为X结点,一个为Y结点,从X结点用弧连接到M的所有初态结点,从M的所有终态结点用弧连接到Y结点,形成一个与M等价的M`,M`只有一个初态和一个终态
最后X和Y结点间的弧上的标记则为所求的正规式
例:
请构造与正规式R=(a*b)*ba(a|b)*等价的状态最少的DFA(确定有限自动机)
根据正规式所构造的NFA为:
bbaa,b
1
aε
确定化
a
b
{1}q0
{1}
{1,2}
{1,2}q1
{1}
{1,2,3}
{1,2,3}q2
{1,4}
{1,2,3}
{1,4}q3
{1,4}
{1,2,4}
{1,2,4}q4
{1,4}
{1,2,3,4}
{1,2,3,4}q5
{1,4}
{1,2,3,4}
其中q3,q4,q5是终态
最小化:
将状态划分为终态集和非终态集{q0.q1.q2}{q3,q4,q5}
输入af(q0,a)=q0∈{q0,q1,q2}f(q1,a)=q0∈{q0,q1,q2}
f(q2,a)=q3∈{q3,q4,q5}q2与q0,q1输入a到达的状态属于不同集合,,所以进一步划分为:
{q0,q1}{q2}
f(q0,b)=q1∈{q0,q1}f(q1,b)=q2∈{q2},q0,q1输入b到达的状态属于不同集合,进一步划分为:
{q0}{q1}
f(q3,a)=q2∈{q2}f(q4,a)=q2∈{q2}f(q5,a)=q2∈{q2}输入a到达的状态属于相同集合;
f(q3,b)=q4∈{q3,q4,q5}f(q4,b)=q5∈{q3,q4,q5}f(q5,b)=q5∈{q3,q4,q5}输入b到达的状态属于相同集合;q3,q4,q5是等价状态
最终划分为:
{q0}{q1}{q2}{q3.q4,q5}
最小化的状态转换矩阵为:
a
b
q0
q0
q1
q1
q0
q2
q2
q3
q2
q3
q3
q3
q3是终态
例.设字符集∑={a,b},请写出不以a开头的但以aa结尾的字符串集合的正规表达式,并构造与之等价的状态最少的DFA。
正规式为:
b(a|b)*aa
根据正规式所构造的NFA