第二章:习题2-4 Table表
var x,y;
procedure p;
var a;
procedure q;
var b;
begin
b:=10;
end;
procedure s;
var c,d;
procedure r;
var e,f;
begin
call q;
end;
begin
call r;
end;
begin
call s;
end;
begin
call p;
end
根据:Page289,变量table:array[0..txmax] of record 结构体以及block函数得到下表,而表中各部分的含义,
第三章文法和语言
5. 写一文法,使其语言是偶正整数的集合
要求:
(1)允许0打头
(2)不允许0打头
解:
(1)G[S]=({S,P,D,N},{0,1,2,…,9},P,S)
P:
S→PD|D
P->NP|N
D→0|2|4|6|8
N->0|1|2|3|4|5|6|7|8|9
(2)G[S]=({S,P,R,D,N,Q },{0,1,2,…,9},P,S)
P:
S→PD|P0|D
P->NR|N
R->QR|Q
D→2|4|6|8
N->1|2|3|4|5|6|7|8|9
Q->0|1|2|3|4|5|6|7|8|9
6. 已知文法G:
<表达式>::=<项>|<表达式>+<项>|<表达式>-<项>
<项>::=<因子>|<项>*<因子>|<项>/<因子>
<因子>::=(<表达式>)|i。
试给出下述表达式的推导及语法树。
(1)i; (2)(i) (3)i*i;
(4)i*i+i; (5)i+(i+i); (6)i+i*i。
解:
(1)v=<表达式>=><项>=><因子>=>i=w
(2)v=<表达式>=><项>=><因子>=>(<表达式>)=>(<项>)=>(<因子>)=>(i)=w
(3)v=<表达式>=><项>=><项>*<因子>=><因子>*<因子>=>i*i=w
(4)v=<表达式>=><表达式>+<项>=><项>+<项>=><项>*<因子>+<项>
=><因子>*<因子>+<因子>=>i*i+i=w
(5)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<因子>=>i+(<表达式>)
=> i+(<表达式>+<项>)=>i+(<项>+<项>)=> i+(<因子>+<因子>)=>i+(i+i)=w
(6)v=<表达式>=><表达式>+<项>=><项>+<项>=><因子>+<项>=>i+<项>
=>i+<项>*<因子>=> i+<因子>*<因子>=> i+i*i=w
语法树见下图:
7. 为句子i+i*i 构造两棵语法树,从而证明下述文法G[<表达式>]是二义的。 <表达式>::=i|(<表达式>)|<表达式><运算符><表达式> <运算符>::=+|-|*|/
解:为句子i+i*i 构造的两棵语法树如下:
所以,该文法是二义的。
<表达式> <项> <因子> i
<表达式> <项> <因子> ( <表达式> )
<项> <因子> i
<表达式> <项>
<项> * <因子>
<因子> i
i
<表达式>
<表达式> + <项> <
项> <项> * <因子> <因子> i
i
<因子> i
<表达式>
<表达式> + <项> <项> <因子> i
<因子> ( <表达式> )
<表达式> + <项> <项> <因子>
i
<因子> i
<表达式>
<表达式> + <项> <项> <因子> i
<项> * <因子> <因子> i
i
(1)i (2)(i) (3)i*i (4) i*i+i (5) i+(i+i) (6) i+i*i <表达式> <表达式> + <表达式> i <表达式> * <表达式> i i <表达式>
<表达式> * <表达式>
<表达式> + <表达式> i i
i
8. 习题1中的文法G[S]是二义的吗?为什么?
答:是二义的。因为对于句子abc 可以有两种不同的生成树,即:S=>Ac=>abc 和S=>aB=>abc 11. 令文法G[E]为: E →T|E+T|E-T T →F|T*F|T/F F →(E)|i
证明E+T*F 是它的一个句型,指出这个句型的所有短语、直接短语和句柄。 解:可为E+T*F 构造一棵语法树(见下图),所以它是句型。
从语法树中容易看出,E+T*F 的短语有:
T*F 是句型E+T*F 的相对于T 的短语,也是相对于规则T →T*F 的直接短语。 E+T*F 是句型E+T*F 的相对于E 的短语。 句型E+T*F 的句柄(最左直接短语)是T*F 。
12. 下述文法G[E]生成的语言是什么?给出该文法的一个句子,该句子至少含五个终结符,构造该句子的语法树。证明:
(1)计算文法G[E]的语言:
由于L(T)={(a|b|c)((a|b|c)(*|/))n
|n>=0} 所以L(E)={L(T)(L(T)(+|-))n
|n>=0}
(2)该文法的一个句子是aab*+,它的语法树是:
(3) 证明:
由于下面的语法树可以生成
E
E + T
T * F
b *
+
由于
由于
显然,句型
(1){a n b n a m b m
|n,m>=0} (2){1n 0m 1m 0n |n,m>=0}
(3){WaW t
|W 属于{0|a}*
,W 表示W t
的逆}
解:
(1)所求文法为G[S]=({S,A},{a,b},P,S),其中P 为: S →AA A →aAb|ε
(2)所求文法为G[S]=({S,A},{0,1},P,S),其中P 为: S →1S0|A
A →0A1|ε
(3)W 属于{0|a}*
是指W 可以的取值为{ε,0,a,00,a0,aa0,00aa,a0a0,…}
如果W=aa0a00,则W t
=00a0aa 。
所求文法为G[S]=({S,P,Q},{0,a},P,S),其中P 为:
S →0S0|aSa|a
15. 语言{WaW}和{a n b m c n d m
}是上下文无关的吗?能看出它们反映程序设计语言的什么特性吗?
答:生成语言{WaW}的文法非常简单,如 G[S]: S →WaW
W →aW|bW|ε
可见G[S]是上下文无关的。
生成语言{a n b m c n d m
}的文法非常复杂,用上下文无关文法不可能办到,只能用上下文有关文法。这是因
为要在a n c n 的中间插入b m 而同时要在其后面插入d m
。即a,c 相关联,b,d 相关联。 这说明对语言的限定越多(特别是语言中的符号前后关联越多),生成它的文法越复杂,甚至于很难找到一个上下文法无关文法。
16.给出生成下述语言的三型文法:
(1){a n
|n>=0}
(2){a n b m
|n,m>=1}
(3){a n b m c k
|n,m,k>=0} 解:
(1)生成的3型文法是:
G[S]:S→aS|ε
(2)生成的2型文法是:
G[S]: S→AB
A→aA|a
B→bB|b
生成的3型文法是:
G[S]:S→aP
P→aP|bD
D→bD|ε
(3)生成的2型文法是:
G[S]: S→ABC
A→aA|ε
B→bB|ε
C->cC|ε
生成的3型方法是:
G[S]:A→aA|bB|cC|ε
B→bB|cC|ε
C→cC|ε
第四章 词法分析
1.构造下列正规式相应的DFA :
(1) 1(0|1)*
101
(2) 1(1010* | 1(010)* 1)*
(3) a((a|b)*|ab *a)*
b
(4) b((ab)* | bb)*
ab 解:
(1)1(0|1)*
101对应的NFA 为
下表由子集法将NFA 转换为DFA :
(2)1(1010* | 1(010)* 1)*
0对应的NFA 为
下表由子集法将
NFA 转换为DFA :
(3)a((a|b)*|ab*a)* b (略)
(4)b((ab)* | bb)* ab (略)
2.已知NFA=({x,y,z},{0,1},M,{x},{z})其中:M(x,0)={z},M(y,0)={x,y},M(z,0)={x,z},M(x,1)={x}, M(y,1)=φ,M(z,1)={y},构造相应的DFA。
解:根据题意有NFA图如下
0,1 下表由子集法将NFA转换为DFA:
下面将该DFA最小化:
(1)首先将它的状态集分成两个子集:P1={A,D,E},P2={B,C,F}
(2)区分P2:由于F(F,1)=F(C,1)=E,F(F,0)=F并且F(C,0)=C,所以F,C等价。由于F(B,0)=F(C,0)=C,
F(B,1)=D,F(C,1)=E,而D,E
不等价(见下步),从而B与C,F可以区分。有P21={C,F},P22={B}。
(3)区分P1:由于A,E输入
0到终态,而D输入0不到终态,所以D与A,E可以区分,有P
11={A,E},P12={D}。
(4)由于F(A,0)=B,F(E,0)=F,而B,F不等价,所以A,E可以区分。
(5)综上所述,DFA可以区分为P={{A},{B},{D},{E},{C,F}}。所以最小化的DFA如下:
3.将图
4.16确定化:
图4.16
1
4.把图4.17的(a)和(b)分别确定化和最小化:
(a) (b)
解:
(a):
下表由子集法将NFA 转换为DFA :
可得图(a1),由于F(A,b)=F(B,b)=C,并且F(A,a)=F(B,a)=B,
所以A,B 等价,可将DFA 最小化,即:删除
B ,将原来引向B 的引线引向与其等价的状态A ,有图
(a2)。(DFA 的最小化,也可看作将上表中的B 全部替换为A ,然后删除B 所在的行。)
(
a1)确定化的DFA (a2)最小化的DFA
0,1
a a
a
(b ):该图已经是DFA 。下面将该DFA 最小化:
(6) 首先将它的状态集分成两个子集:P 1={0},P 2={1,2,3,4,5}
(7) 区分P 2:由于F(4,a)=0属于终态集,而其他状态输入a 后都是非终态集,所以区分P 2如下:
P 21={4},P 22={1,2,3,5}。
(8) 区分P 22:由于F(1,b)=F(5,b)=4属于P 21,而F(2,b)与F(3,b)不等于4,即不属于P 21,所以区分P 22如下:
P 221={1,5},P 222={2,3}。
(9) 区分P 221:由于F(1,b)=F(5,b)=4,即F(1,a)=1,F(5,a)=5,所以1,5等价。
(10) 区分P 222:由于F(2,a)=1属于P 221,而F(3,a)=3属于P 222,所以2,3可区分。P 222区分为P 2221{2},P 2222{3}。 (11) 结论:该DFA 的状态集可分为:P={ {0},{1,5},{2},{3},{4} },其中1,5等价。删去状态5,将原来
引向5的引线引向与其等价的状态1,有图(b1)。
(b1)最小化的DFA
5.构造一个DFA ,它接收Σ={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。然后再构造该语言的正则文法。
解:根据题意,DFA 所对应的正规式应为:(0|(10))*
。所以,接收该串的NFA 如下:
显然,A ,B 等价,所以将上述
DFA 最小化后有:
对应的正规文法为: G[A]:
A →
1C|0A|ε C →
0A
6.设无符号数的正规式为θ:
θ=dd *|dd *.dd *|.dd *|dd *e(s|ε)dd *|e(s|ε)dd *|.dd *e(s|ε)dd *|dd *.dd *e(s|ε)dd *
化简θ,画出θ的DFA ,其中d ={0,1,2,…9},s={+,-}
解:把原正规式的每2,3项,4,5项,6,7项分别合并后化简有:
θ=dd *
|d *
.dd *
|d *
e(s|ε)dd *
|d *
.dd *
e(s|ε)dd *
=dd *
|d *
.dd *
|(d *
|d *
.dd *
)e(s|ε)dd *
=(ε|d *
.|(d *
|d *
.dd *
)e(s|ε))dd
* =(ε|d *
.|d *
(ε|.dd *
)e(s|ε))dd
*
下面构造化简后的θ对应的NFA :
下表由子集法将NFA 转换为DFA :
7.给文法G[S]: S →aA|bQ A →aA|bB|b B →bD|aQ Q →aQ|bD|b D →bB|aA E →aB|bF
F →bD|aE|b
构造相应的最小的DFA 。
解:由于从S 出发任何输入串都不能到达状态E 和F ,所以,状态E ,F 为多余的状态,不予考虑。这样,可以写出文法G[S]对应的NFA :
(1)因为4,5是DFA 的终态,其他是非终态,可将状态集分成两个子集: P 1={1,2,3,6,7},P 2={4,5}
(2)在P 1中因为2,3输入b 后是终态,而1,6,7输入b 后是非终态,所以P 1可区分为: P 11={1,6,7},P 12={2,3}
(3)在P 11中由于1输入b 后为3,6输入b 后为7,而3,7分属P 11和P 12,所以1与6不等价,同理,1与7不等价。所以P 11可区分为:
P 111={1},P 112={6,7}
(4)查看P 112={6,7},由于输入a 后为2,3,所以6,7是否等价由2,3是否等价决定。 (5)查看P 12={2,3},由于输入b 后为4,5,所以2,3是否等价由4,5是否等价决定。
(6)查看P 2={4,5} , 显然4,5是否等价由2,3与6,7是否同时等价决定。由于有(4)即6,7是否等价由2,3是否等价决定,所以,4,5是否等价由2,3是否等价决定。由于有(5)即2,3是否等价由4,5是否等价决定,所以有4,5等价,2,3等价,进而6,7也等价。
(7)删除上表中的第3,5,7行,并将剩余行中的3
,5
,7分别改为对应的等价状态为2,4,6有下表:
a
这样可得最小化的DFA 如下:
8.给出下述文法所对应的正规式: S →0A|1B A →1S|1 B →0S|0 解:把后两个产生式代入第一个产生式有:
S=01|01S S=10|10S
有:S=01S|10S|01|10=(01|10)S|(01|10)=(01|10)*
(01|10) 即:(01|10)*
(01|10)为所求的正规式。
9.将图4.18的DFA 最小化,并用正规式描述它所识别的语言:
解:
(1) 因为6,7是DFA 的终态,其他是非终态,可将状态集分成两个子集:P1={1,2,3,4,5},P2={6,
7}。
(2)
由于F(6,b)=F(7,b)=6,而6,7又没有其他输入,所以6,7等价。
(3) 由于F(3,c)=F(4,c)=3,F(3,d)=F(4,d)=5,F(3,b)=6,F(4,b)=7,而6,7等价,所以3,4等价。 (4) 由于F(1,b)=F(2,b)=2,F(1,a)=3,F(2,a)=4,而3,4等价,所以1,2等价。 (5) 由于状态5没有输入字符b,所以与1,2,3,4都不等价。
(6) 综上所述,上图DFA 的状态可最细分解为:P={{1,2},{3,4},{5},{6,7}}。
该DFA 用正规式表示为:
b *a(c|da)*bb *
b
b
10.构造下述文法G[S]的自动机: S →A0 A →A0|S1|0
该自动机是确定的吗?若不确定,则对它确定化。该自动机相应的语言是什么?
解:
由于该文法的产生式S →A0,A →A0|S1中没有字符集V T 的输入,所以不是确定的自动机。要将其他确定化,必须先用代入法得到它对应的正规式。把S →A0代入产生式A →S1有:A=A0|A01|0=A(0|01)|0=0(0|01)*
。代入S →A0有该文法的正规式:0(0|01)*
0,所以,改写该文法为确定的自动机为:
由于状态A 有3次输入0的重复输入,所以上图只是NFA ,下面将它确定化:
由上表可知DFA 为:
第五章自顶向下语法分析方法
1.对文法G[S]
S→a|∧|(T)
T→T,S|S
(1)给出(a,(a,a))和(((a,a),∧,(a)),a)的最左推导。
(2)对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4)给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
解:
(1) (a,(a,a))的最左推导为S→(T)→(T,S)→(S,S)→(a,(T))→(a,(T,S))→(a,(S,a))→(a,(a,a))
(((a,a),∧,(a)),a)的最左推导为
S→(T)→(T,S)→(S,a)→((T),a)→((T,S),a)→((T,S,S),a)→((S,∧,(T)),a)→(((T),∧,(S)),a) →(((T,S),∧,(a)),a)→(((S,a),∧,(a)),a)→(((a,a),∧,(a)),a)
(2)由于有T→T,S的产生式,所以消除该产生式的左递归,增中一个非终结符U有新的文法G/[S]:
S→a|∧|(T)
T→SU
U→,SU|ε
分析子程序的构造方法
对满足条件的文法按如下方法构造相应的语法分析子程序。
(1) 对于每个非终结号U,编写一个相应的子程序P(U);
(2) 对于规则U::=x1|x2|..|xn,有一个关于U的子程序P(U),P(U)按如下方法构造:
IF CH IN FIRST(x1) THEN P(x1)
ELSE IF CH IN FIRST(x2) THEN P(x2)
ELSE ...
.
.
.
IF CH IN FIRST(xn) THEN P(xn)
ELSE ERROR
其中,CH存放当前的输入符号,是一个全程变量;ERROR是一段处理出错信息的程序;
P(xj)为相应的子程序。
(3) 对于符号串x=y1y2...yn;p(x)的含义为:
BEGIN
P(y1);
P(y2);
...
P(yn);
END
如果yi是非终结符,则P(yi)代表调用处理yi的子程序;
如果yi是终结符,则P(yi)为形如下述语句的一段子程序
IF CH=yi THEN READ(CH) ELSE ERROR
即如果当前文法中的符号与输入符号匹配,则继续读入下一个待输入符号到CH中,
否则表明出错。
(4) 如果文法中有空规则U::=EPSILON,则算法中的语句
IF CH IN FIRST(xn) THEN P(xn)
ELSE ERROR
改写为:
IF CH IN FIRST(xn) THEN P(xn)
ELSE IF CH IN FOLLOW(U) THEN RETURN
ERROR
(5) 要分析一个OrgStr,应在该串的后面加上一个串括号'#',并从子程序P(S)(S为文法的开始符号)开始,
如果中途没有产生错误,并且最后CH='#',则说明OrgStr串合法,否则该串不合法。
对每个非终结符写出不带回溯的递归子程序如下:
char CH;//存放当前的输入符号
void P_S()//非终结符S的子程序
{
if(CH==’a’) READ(CH);//产生式S→a
else if(CH==’^’) READ(CH);//产生式S→^
else if(CH==’(’)//产生式S→(T)
{
READ(CH);
P_T();
IF (CH==’)’) THEN READ(CH) else ERROR
}
else ERR;
}
void P_T()//非终结符S的子程序
{
if(IsIn(CH,FIRST_SU)) //FIRST_SU为T→SU的右部的FIRST集合
{
P_S();
P_U();
}
}
void P_U()//非终结符U的子程序
{
if(CH==’,’)//产生式U→,SU
{
READ(CH);
P_S();
P_U();
}
else//产生式U→ε
{
if(IsIn(CH,FOLLOW_U)) //FOLLOW_U为U的FOLLOW集合
return ;
else ERR;
}
}
(3)判断文法G/[S]是否为LL(1)文法。
各非终结符的FIRST集合如下:
FIRST(S)={a,∧,(}
FIRST(T)=FIRST(S)={a,∧,(}
FIRST(U)={,,ε}
各非终结符的FOLLOW集合如下:
FOLLOW(S)={#} ∪ FIRST(U) ∪ FOLLOW(T) ∪ FOLLOW(U)={#,,,)}
FOLLOW(T)={)}
FOLLOW(U)=FOLLOW(T)={)}
每个产生式的SELECT集合如下:
SELECT(S→a)={a}
SELECT(S→∧)={∧}
SELECT(S→(T))={(}
SELECT(T→SU)=FIRST(S)={a,∧,(}
SELECT(U→,SU)={,}
SELECT(U→ε)=FOLLOW(U)={)}
可见,相同左部产生式的SELECT集的交集均为空,所以文法G/[S]是LL(1)文法。
文法G/[S]的预测分析表如下:
(5)给出输入串(a,a)#的分析过程
2.对下面的文法G:
E→TE/
E/→+E|ε
T→FT/
T/→T|ε
F→PF/
F/→*F/|ε
P→(E)|a|b|^
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
(2)证明这个方法是LL(1)的。
(3)构造它的预测分析表。
(4)构造它的递归下降分析程序。
解:
(1)计算这个文法的每个非终结符的FIRST集和FOLLOW集。
FIRST集合有:
FIRST(E)=FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(E/)={+,ε}
FIRST(T)=FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(T/)=FIRST(T)∪{ε}={(,a,b,^,ε};
FIRST(F)=FIRST(P)={(,a,b,^};
FIRST(F/)=FIRST(P)={*,ε};
FIRST(P)={(,a,b,^};
FOLLOW集合有:
FOLLOW(E)={),#};
FOLLOW(E/)=FOLLOW(E)={),#};
FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};//不包含ε
FOLLOW(T/)=FOLLOW(T)=FIRST(E/)∪FOLLOW(E)={+,),#};
FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};//不包含ε
FOLLOW(F/)=FOLLOW(F)=FIRST(T/)∪FOLLOW(T)={(,a,b,^,+,),#};
FOLLOW(P)=FIRST(F/)∪FOLLOW(F)={*,(,a,b,^,+,),#};//不包含ε
(2)证明这个方法是LL(1)的。
各产生式的SELECT集合有:
SELECT(E→TE/)=FIRST(T)={(,a,b,^};
SELECT(E/→+E)={+};
SELECT(E/→ε)=FOLLOW(E/)={),#}
SELECT(T→FT/)=FIRST(F)={(,a,b,^};
SELECT(T/→T)=FIRST(T)={(,a,b,^};
SELECT(T/→ε)=FOLLOW(T/)={+,),#};
SELECT(F→PF/)=FIRST(P)={(,a,b,^};
SELECT(F/→*F/)={*};
SELECT(F/→ε)=FOLLOW(F/)={(,a,b,^,+,),#};
SELECT(P→(E))={(}
SELECT(P→a)={a}
SELECT(P→b)={b}
SELECT(P→^)={^}
可见,相同左部产生式的SELECT集的交集均为空,所以文法G[E]是LL(1)文法。
(3)构造它的预测分析表。
文法G[E]的预测分析表如下:
(4)构造它的递归下降分析程序。
对每个非终结符写出不带回溯的递归子程序如下:
char CH;//存放当前的输入符号
void P_E()//非终结符E的子程序
{
if(IsIn(CH,FIRST_TEP)) //FIRST_TEP为T→TE/ 的右部的FIRST集合,产生式E→TE/
{
P_T();
P_EP();
}
else ERR;
}
void P_EP()//非终结符E/的子程序
{
if(CH==’+’) //产生式E/→+E
{
READ(CH);
P_E();
}
else//产生式E/→ε
{
if(IsIn(CH,FOLLOW_EP)) //FOLLOW_EP为E/的FOLLOW集合
return ;
else ERR;
}
}
void P_T()//非终结符T的子程序
{
if(IsIn(CH,FIRST_FTP)) //FIRST_TEP为T→FT/ 的右部的FIRST集合,产生式T→FT/
{
P_F();
P_TP();
}
else ERR;
}
void P_TP()//非终结符T/的子程序
{
if(IsIn(CH,FIRST_T)) //FIRST_T为产生式T/→T的右部的FIRST集合,产生式T/→T {
P_T();
}
else//产生式T/→ε
{
if(IsIn(CH,FOLLOW_TP)) //FOLLOW_TP为T/的FOLLOW集合
return ;
精品文档 第二章 P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************
第一章 1.典型的编译程序在逻辑功能上由哪几部分组成? 答:编译程序主要由以下几个部分组成:词法分析、语法分析、语义分析、中间代码生成、中间代码优化、目标代码生成、错误处理、表格管理。 2. 实现编译程序的主要方法有哪些? 答:主要有:转换法、移植法、自展法、自动生成法。 3. 将用户使用高级语言编写的程序翻译为可直接执行的机器语言程序有哪几种主要的方式? 答:编译法、解释法。 4. 编译方式和解释方式的根本区别是什么? 答:编译方式:是将源程序经编译得到可执行文件后,就可脱离源程序和编译程序单独执行,所以编译方式的效率高,执行速度快; 解释方式:在执行时,必须源程序和解释程序同时参与才能运行,其不产生可执行程序文件,效率低,执行速度慢。
第二章 1.乔姆斯基文法体系中将文法分为哪几类?文法的分类同程序设计语言的设计与实现关 系如何? 答:1)0型文法、1型文法、2型文法、3型文法。 2) 2. 写一个文法,使其语言是偶整数的集合,每个偶整数不以0为前导。 答: Z→SME | B S→1|2|3|4|5|6|7|8|9 M→ε | D | MD D→0|S B→2|4|6|8 E→0|B 3. 设文法G为: N→ D|ND D→ 0|1|2|3|4|5|6|7|8|9 请给出句子123、301和75431的最右推导和最左推导。 答:N?ND?N3?ND3?N23?D23?123 N?ND?NDD?DDD?1DD?12D?123 N?ND?N1?ND1?N01?D01?301 N?ND?NDD?DDD?3DD?30D?301 N?ND?N1?ND1?N31?ND31?N431?ND431?N5431?D5431?75431 N?ND?NDD?NDDD?NDDDD?DDDDD?7DDDD?75DDD?754DD?7543D?75431 4. 证明文法S→iSeS|iS| i是二义性文法。 答:对于句型iiSeS存在两个不同的最左推导: S?iSeS?iiSes S?iS?iiSeS 所以该文法是二义性文法。 5. 给出描述下面语言的上下文无关文法。 (1)L1={a n b n c i |n>=1,i>=0 } (2)L2={a i b j|j>=i>=1} (3)L3={a n b m c m d n |m,n>=0} 答: (1)S→AB A→aAb | ab B→cB | ε (2)S→ASb |ab
编译原理复习题及答案 一、选择题 1.一个正规语言只能对应(B) A 一个正规文法 B 一个最小有限状态自动机 2.文法G[A]:A→εA→aB B→Ab B→a是(A) A 正规文法 B 二型文法 3.下面说法正确的是(A) A 一个SLR(1)文法一定也是LALR(1)文法 B 一个LR(1)文法一定也是LALR(1)文法 4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的(A) A 必要条件 B 充分必要条件 5.下面说法正确的是(B) A 一个正规式只能对应一个确定的有限状态自动机 B 一个正规语言可能对应多个正规文法 6.算符优先分析与规范归约相比的优点是(A) A 归约速度快 B 对文法限制少 7.一个LR(1)文法合并同心集后若不是LALR(1)文法(B) A 则可能存在移进/归约冲突 B 则可能存在归约/归约冲突 C 则可能存在移进/归约冲突和归约/归约冲突 8.下面说法正确的是(A) A Lex是一个词法分析器的生成器 B Yacc是一个语法分析器 9.下面说法正确的是(A) A 一个正规文法也一定是二型文法 B 一个二型文法也一定能有一个等价的正规文法 10.编译原理是对(C)。 A、机器语言的执行 B、汇编语言的翻译 C、高级语言的翻译 D、高级语言程序的解释执行 11.(A)是一种典型的解释型语言。
A.BASIC B.C C.FORTRAN D.PASCAL 12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。 A. 编译器 B. 汇编器 C. 解释器 D. 预处理器 13.用高级语言编写的程序经编译后产生的程序叫(B) A.源程序 B.目标程序C.连接程序D.解释程序 14.(C)不是编译程序的组成部分。 A.词法分析程序 B.代码生成程序 C.设备管理程序 D.语法分析程序 15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。 A.模拟执行器B.解释器 C.表格处理和出错处理D.符号执行器16.编译程序绝大多数时间花在(D)上。 A.出错处理B.词法分析C.目标代码生成D.表格管理 17.源程序是句子的集合,(B)可以较好地反映句子的结构。 A. 线性表 B. 树 C. 完全图 D. 堆栈 18.词法分析器的输出结果是(D)。 A、单词自身值 B、单词在符号表中的位置 C、单词的种别编码 D、单词的种别编码和自身值 19.词法分析器不能(D) A. 识别出数值常量 B. 过滤源程序中的注释 C. 扫描源程序并识别记号 D. 发现括号不匹配 20.文法:G:S→xSx | y所识别的语言是(D)。 A、xyx B、(xyx)* C、x*yx* D、x n yx n (n≥0) 21.如果文法G是无二义的,则它的任何句子α(A) A.最左推导和最右推导对应的语法树必定相同 B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同 D.可能存在两个不同的最左推导,但它们对应的语法树相同 22.正则文法(A)二义性的。 A. 可以是 B. 一定不是 C. 一定是 23.(B)这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 A. 存在 B. 不存在 C. 无法判定是否存在 24.给定文法A→bA | ca,为该文法句子的是(C) A. bba B. cab C. bca D. cba
中南大学网络教育课程考试复习题及参考答案 编译原理 一、判断题: 1.一个上下文无关文法的开始符,可以是终结符或非终结符。 ( ) 2.一个句型的直接短语是唯一的。 ( ) 3.已经证明文法的二义性是可判定的。 ( ) 4.每个基本块可用一个DAG表示。 ( ) 5.每个过程的活动记录的体积在编译时可静态确定。 ( ) 6.2型文法一定是3 型文法。 ( ) 7.一个句型一定句子。 ( ) 8.算符优先分析法每次都是对句柄进行归约。 ( ) 9.采用三元式实现三地址代码时,不利于对中间代码进行优化。 ( ) 10.编译过程中,语法分析器的任务是分析单词是怎样构成的。 ( ) 11.一个优先表一定存在相应的优先函数。 ( ) 12.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 ( ) 13.递归下降分析法是一种自下而上分析法。 ( ) 14.并不是每个文法都能改写成 LL(1)文法。 ( ) 15.每个基本块只有一个入口和一个出口。 ( ) 16.一个 LL(1)文法一定是无二义的。 ( ) 17.逆波兰法表示的表达试亦称前缀式。 ( ) 18.目标代码生成时,应考虑如何充分利用计算机的寄存器的问题。 ( ) 19.正规文法产生的语言都可以用上下文无关文法来描述。 ( ) 20.一个优先表一定存在相应的优先函数。 ( ) 21.3型文法一定是 2型文法。 ( ) 22.如果一个文法存在某个句子对应两棵不同的语法树,则文法是二义性的。 ( ) 二、填空题: 1.( )称为规范推导。 2.编译过程可分为(),(),(),()和()五个阶段。 3.如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是()。 4.从功能上说,程序语言的语句大体可分为()语句和()语句两大类。 5.语法分析器的输入是(),其输出是()。 6.扫描器的任务是从()中识别出一个个()。 7.符号表中的信息栏中登记了每个名字的有关的性质,如()等等。 8.一个过程相应的DISPLAY表的内容为()。 9.一个句型的最左直接短语称为句型的()。 10.常用的两种动态存贮分配办法是()动态分配和()动态分配。 11.一个名字的属性包括( )和( )。 12.常用的参数传递方式有(),()和()。 13.根据优化所涉及的程序范围,可将优化分成为(),()和()三个级别。 14.语法分析的方法大致可分为两类,一类是()分析法,另一类是()分析法。 15.预测分析程序是使用一张()和一个()进行联合控制的。 16.常用的参数传递方式有(),()和()。 17.一张转换图只包含有限个状态,其中有一个被认为是()态;而且实际上至少要有一个()态。 18.根据优化所涉及的程序范围,可将优化分成为(),()和()三个级别。 19.语法分析是依据语言的()规则进行。中间代码产生是依据语言的()规则进行的。 20.一个句型的最左直接短语称为句型的()。 21.一个文法G,若它的预测分析表M不含多重定义,则该文法是()文法。 22.对于数据空间的存贮分配, FORTRAN采用( )策略, PASCAL采用( )策略。
第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1
第1章引论 第1题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1) 编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2) 源程序:源语言编写的程序称为源程序。 (3) 目标程序:目标语言书写的程序称为目标程序。 (4) 编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5) 后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6) 遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。 注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚,就回答八部分。 第3题 何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 答案: 翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,如编译程序和汇编程序等。 编译程序是把用高级语言编写的源程序转换(加工)成与之等价的另一种用低级语言编写的目标程序的翻译程序。 解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,则依据这个单词把控制转移到实现这条语句功能的程序部分,该部分负责完成这条语句的功
第一章 1、将编译程序分成若干个“遍”就是为了。 a.提高程序得执行效率 b.使程序得结构更加清晰 c.利用有限得机器内存并提高机器得执行效率 d.利用有限得机器内存但降低了机器得执行效率 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法d.以上三项都就是 3、变量应当。 a.持有左值b.持有右值 c.既持有左值又持有右值d.既不持有左值也不持有右值 4、编译程序绝大多数时间花在上。 a.出错处理b.词法分析 c.目标代码生成d.管理表格 5、不可能就是目标代码。 a.汇编指令代码b.可重定位指令代码 c.绝对指令代码d.中间代码 6、使用可以定义一个程序得意义。 a.语义规则b.语法规则 c.产生规则d.词法规则 7、词法分析器得输入就是。 a.单词符号串b.源程序 c.语法单位d.目标程序 8、中间代码生成时所遵循得就是- 。 a.语法规则b.词法规则 c.语义规则d.等价变换规则 9、编译程序就是对。 a.汇编程序得翻译b.高级语言程序得解释执行 c.机器语言得执行d.高级语言得翻译 10、语法分析应遵循。 a.语义规则b.语法规则 c.构词规则d.等价变换规则 二、多项选择题 1、编译程序各阶段得工作都涉及到。 a.语法分析b.表格管理c.出错处理 d.语义分析e.词法分析 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成 d.语义检查e.目标代码生成 三、填空题 1、解释程序与编译程序得区别在于。 2、编译过程通常可分为5个阶段,分别就是、语法分析、代码优化与目标代码生成。 3、编译程序工作过程中,第一段输入就是,最后阶段得输出为程序。
第1 章 1、编译过程包括哪几个主要阶段及每个 阶段的功能。 答案:编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5 个阶段。词法分析的功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。 第2 章 1、写一上下文无关文法G,它能产生配 对的圆括号串(如:(),(()),()(())等,甚至 包括0 对括号) 文法为:S→(L)|LS|L L→S| ε 2 、已知文法G :E→E+T|E-T|T T→T*F|T/F|F F→(E) |i (1)给出i+i*i,i*(i-i)的最左推导,最右推导以及语法树。 (2)i-i+i 哪个算符优先。 【解答】 (1)最左推导:E?E+T?T+T? F+T ? i+T ? i+T*F ? i+F*F ?i+i*F ?i+i*i E?T?T*F? F*F ? i*F ? i*(E) ? i*(E-T) ? i*(T-T) ? i*(F-T) ? i*(i-T) ? i*(i-F) ?i*(i-i) 最右推导:E?E+T?E+T*F? E+T*i ? E+F*i ? E+i*i ? T+i*i ? F+i*i ? i+i*i E?T?T*F? T*(E) ? T*(E-T) ? T*(E-F) ? T*(E-i) ? T*(T-i) ? T*(F-i) ?T*(i-i) ? F*(i-i) ?i*(i-i) i+i*i 以及i*(i-i)的语法树如下所示: (2)i-i+i 的语法树如下图所示。 从上图的语法树可知:“-”的位置位 于“+”的下层,也就是前面两个i 先进 行“-”运算,再与后面的i 进行“+” 运算,所以“-”的优先级高于“+”的 优先级。 3 、文法G: E→ET+|T T→TF*|F F→FP↑|P P→E|i (1)试证明符号串TET+*i↑是G 的一 个句型(要求画出语法树). (2)写出该句型的所有短语,直接短语和句柄. 【解答】(1)采用最右推导: E?T?F? FP↑? Fi↑? Pi↑? Ei↑ ? Ti↑? TF*i↑? TP*i↑? TE*i↑? TET+*i↑ 语法树如下图所示。 从文法G 的起始符号出发,能够推导 出符号串TET+*i↑,所以给定符号串是文法G的句型。 (2) 该句型的短语有: ET+,TET+*,i ,TET+*i↑ 直接短语有:ET+, i 句柄是:ET+ 4、已知文法G:S→iSeS|iS|i ,该文法 是二义文法吗?为什么? 【解答】该文法是二义文法。 因为对于句子iiiei 存在两种不同的最 左推导: 第 1 种推导:S? iSeS? iiSeS? iiieS? iiiei 第2种推导:S?iS?iiSeS?iiieS?iiiei 第3 章 1、用正规式描述下列正规集: (1)C 语言的十六进制整数; (2)以ex 开始或以ex 结束的所有小写字母构成的符号串; (3)十进制的偶数。 【解答】 (1)C 语言十六进制整数以0x 或者0X 开头,所以一般形式应该为(+|-|ε) (0x|0X)AA*,其中前面括号表示符号, 可以有正号、负号,也可以省略(用ε表示)默认是正数,A 表示有资格出现在十六进制整数数位上的数字,AA*表示一位或者多位(一个或者多个数字的
目录 P36-6 (2) P36-7 (2) P36-8 (2) P36-9 (3) P36-10 (3) P36-11 (3) P64–7 (4) P64–8 (5) P64–12 (5) P64–14 (7) P81–1 (8) P81–2 (9) P81–3 (12) P133–1 (12) P133–2 (12) P133–3 (14) P134–5 (15) P164–5 (19) P164–7 (19) P217–1 (19) P217–3 (20) P218–4 (20) P218–5 (21) P218–6 (22) P218–7 (22) P219–12 (22) P270–9 (24)
P36-6 (1) L G ()1是0~9组成的数字串 (2) 最左推导: N ND NDD NDDD DDDD DDD DD D N ND DD D N ND NDD DDD DD D ??????????????????0010120127334 556568 最右推导: N ND N ND N ND N D N ND N D N ND N ND N D ??????????????????77272712712701274434 886868568 P36-7 G(S) O N O D N S O AO A AD N →→→→→1357924680||||||||||| P36-8 文法: E T E T E T T F T F T F F E i →+-→→|||*|/()| 最左推导: E E T T T F T i T i T F i F F i i F i i i E T T F F F i F i E i E T i T T i F T i i T i i F i i i ?+?+?+?+?+?+?+?+??????+?+?+?+?+?+********()*()*()*()*()*()*() 最右推导: E E T E T F E T i E F i E i i T i i F i i i i i E T F T F F F E F E T F E F F E i F T i F F i F i i i i i ?+?+?+?+?+?+?+?+?????+?+?+?+?+?+?+**********()*()*()*()*()*()*()*() 语法树:/********************************
第 1 章引论 第1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 答案: 一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
编译原理复习题及答案一、选择题 1.一个正规语言只能对应( B ) A 一个正规文法 B 一个最小有限状态自动机 2.文法G[A]:A→εA→aB B→Ab B→a是( A ) A 正规文法 B 二型文法 3.下面说法正确的是( A ) A 一个SLR(1)文法一定也是LALR(1)文法 B 一个LR(1)文法一定也是LALR(1)文法 4.一个上下文无关文法消除了左递归,提取了左公共因子后是满足LL(1)文法的( A ) A 必要条件 B 充分必要条件 5.下面说法正确的是( B ) A 一个正规式只能对应一个确定的有限状态自动机 B 一个正规语言可能对应多个正规文法 6.算符优先分析与规范归约相比的优点是( A ) A 归约速度快 B 对文法限制少 7.一个LR(1)文法合并同心集后若不是LALR(1)文法( B ) A 则可能存在移进/归约冲突 B 则可能存在归约/归约冲突 C 则可能存在移进/归约冲突和归约/归约冲突 8.下面说法正确的是( A ) A Lex是一个词法分析器的生成器 B Yacc是一个语法分析器 9.下面说法正确的是( A ) A 一个正规文法也一定是二型文法 B 一个二型文法也一定能有一个等价的正规文法 10.编译原理是对(C)。 A、机器语言的执行 B、汇编语言的翻译 C、高级语言的翻译 D、高级语言程序的解释执行
11.(A)是一种典型的解释型语言。 A.BASIC B.C C.FORTRAN D.PASCAL 12.把汇编语言程序翻译成机器可执行的目标程序的工作是由(B)完成的。 A. 编译器 B. 汇编器 C. 解释器 D. 预处理器 13.用高级语言编写的程序经编译后产生的程序叫(B) A.源程序?B.目标程序C.连接程序D.解释程序14.(C)不是编译程序的组成部分。 A.词法分析程序 B.代码生成程序? C.设备管理程序 D.语法分析程序 15.通常一个编译程序中,不仅包含词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成等六个部分,还应包括(C)。 A.模拟执行器B.解释器?C.表格处理和出错处理 ??? D.符号执行器16.编译程序绝大多数时间花在(D)上。 A.出错处理B.词法分析C.目标代码生成D.表格管理 17.源程序是句子的集合,(B)可以较好地反映句子的结构。 A. 线性表 B. 树 C. 完全图 D. 堆栈 18.词法分析器的输出结果是(D)。 A、单词自身值 B、单词在符号表中的位置 C、单词的种别编码 D、单词的种别编码和自身值 19.词法分析器不能(D) A. 识别出数值常量 B. 过滤源程序中的注释 C. 扫描源程序并识别记号 D. 发现括号不匹配 20.文法:G:S→xSx | y所识别的语言是(D)。 A、xyx B、(xyx)* C、x*yx* D、x n yx n(n≥0) 21.如果文法G是无二义的,则它的任何句子α(A) A.最左推导和最右推导对应的语法树必定相同 B.最左推导和最右推导对应的语法树可能不同 C.最左推导和最右推导必定相同 D.可能存在两个不同的最左推导,但它们对应的语法树相同 22.正则文法(A)二义性的。 A. 可以是 B. 一定不是 C. 一定是 23.(B)这样一些语言,它们能被确定的有穷自动机识别,但不能用正则表达式表示。 A. 存在 B. 不存在 C. 无法判定是否存在 24.给定文法A→bA | ca,为该文法句子的是(C)
第三章 N=>D=> {0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD L={a |a(0|1|3..|9)n且 n>=1} (0|1|3..|9)n且 n>=1 {ab,} a n b n n>=1 第6题. (1) <表达式> => <项> => <因子> => i (2) <表达式> => <项> => <因子> => (<表达式>) => (<项>) => (<因子>)=>(i) (3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i (4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项> => <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>) => i+(<因子>+<因子>) => i+(i+i) (6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i 第7题
第9题 语法树 s s s* s s+a a a 推导: S=>SS*=>SS+S*=>aa+a* 11. 推导:E=>E+T=>E+T*F 语法树: E +T * 短语: T*F E+T*F 直接短语: T*F 句柄: T*F 12.
编译原理及实现课后习题解答 2.1设字母表A={a},符号串x=aaa,写出下列符号串及其长度:x0,xx,x5 以及A+和A*. x0=(aaa)0=ε| x0|=0 xx=aaaaaa |xx|=6 x5=aaaaaaaaaaaaaaa | x5|=15 A+ =A1∪A2∪ …. ∪A n∪…={a,aa,aaa,aaaa,aaaaa…} A* = A0 ∪A1 ∪A2 ∪…. ∪A n ∪…={ε,a,aa,aaa,aaaa,aaaaa…} 2.2令∑={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3 xy=abcb |xy|=4 xyz=abcbaab |xyz|=7 (xy)3=(abcb)3 =abcbabcbabcb | (xy)3 |=12 2.3设有文法G[S]:S∷=SS*|SS+|a,写出符号串aa+a*规范推导,并构造语 法树。 S => SS* => Sa* => SS+a* => Sa+a* => aa+a*
S S S * S S + a a a 2.4 已知文法G[Z]:Z∷=U0∣V1 、U∷=Z1∣1 、V∷=Z0∣0 ,请写出全部由此文法描述的只含有四个符号的句子。 Z=>U0=>Z10=>U010=>1010 Z=>U0=>Z10=>V110=>0110 Z=>V1=>Z01=>U001=>1001 Z=>V1=>Z01=>V101=>0101 2.5已知文法G[S]:S∷=AB A∷=aA︱εB∷=bBc︱bc , 写出该文法描述的语言。 A∷=aA︱ε描述的语言: {a n|n>=0} B∷=bBc︱bc 描述的语言:{b n c n|n>=1} L(G[S])={a n b m c m|n>=0,m>=1} 2.6已知文法E∷=T∣E+T∣E-T 、T∷=F∣T*F∣T/F 、F∷=(E)∣i,写出该文法的开始符号、终结符号集合V T、非终结符号集合V N。 开始符号:E V t={+, - , * , / ,(, ), i} V n={E , F , T}
《编译原理》常见题型 一、填空题 1.编译程序的工作过程一般可以划分为词法分析,语法分析,中间代码生成,代码优化(可省) ,目标代码生成等几个基本阶段。 2.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序. 3.编译方式与解释方式的根本区别在于是否生成目标代码. 5.对编译程序而言,输入数据是源程序,输出结果是目标程序. 7.若源程序是用高级语言编写的,目标程序是机器语言程序或汇编程序,则其翻译程序称为编译程序。 8.一个典型的编译程序中,不仅包括词法分析、语法分析、中间代码生成、代码优化、目标代码生成等五个部分,还应包括表格处理和出错处理。其中,词法分析器用于识别单词。 10.一个上下文无关文法所含四个组成部分是一组终结符号、一组非终结符号、一个开始符号、一组产生式。 12.产生式是用于定义语法成分的一种书写规则。 13.设G[S]是给定文法,则由文法G所定义的语言L(G)可描述为:L(G)={x│S=>*x,x∈VT*} 。 14.设G是一个给定的文法,S是文法的开始符号,如果S * ?x(其中x∈V*),则称x是 文法的一个句型。 15.设G是一个给定的文法,S是文法的开始符号,如果S * ?x(其中x∈V T*),则称x是文 法的一个句子。 16.扫描器的任务是从源程序中识别出一个个单词符号。 17.语法分析最常用的两类方法是自上而下和自下而上分析法。 18.语法分析的任务是识别给定的终结符串是否为给定文法的句子。 19.递归下降法不允许任一非终结符是直接左递归的。 20.自顶向下的语法分析方法的关键是如何选择候选式的问题。 21.递归下降分析法是自顶向下分析方法。 22.自顶向下的语法分析方法的基本思想是:从文法的开始符号开始,根据给定的输入串并按照文法的产生式一步一步的向下进行直接推导,试图推导出文法的句子,使之与给定的输入串匹配。 23.自底向上的语法分析方法的基本思想是:从给定的终结符串开始,根据文法的规则一步一步的向上进行直接归约,试图归约到文法的开始符号。 24.自底向上的语法分析方法的基本思想是:从输入串入手,利用文法的产生式一步一步地 向上进行直接归约,力求归约到文法的开始符号。 26.在LR(0)分析法的名称中,L的含义是自左向右的扫描输入串,R的含义是最 左归约,0 的含义是向貌似句柄的符号串后查看0个输入符号。 31.终结符只有综合属性,它们由词法分析器提供。
2.1 设字母表A={a},符号串x=aaa,写出下列符号串及其长度:x0,xx,x5以及A+和A*. x0=(aaa)0=ε | x0|=0 xx=aaaaaa |xx|=6 x5=aaaaaaaaaaaaaaa | x5|=15 A+ =A1∪A2∪…. ∪A n∪…={a,aa,aaa,aaaa,aaaaa…} A* = A0 ∪A1 ∪ A2∪…. ∪ A n∪…={ε,a,aa,aaa,aaaa,aaaaa…} 2.2 令∑={a,b,c},又令x=abc,y=b,z=aab,写出如下符号串及它们的长度:xy,xyz,(xy)3 xy=abcb |xy|=4 xyz=abcbaab |xyz|=7 (xy)3=(abcb)3 =abcbabcbabcb | (xy)3 |=12 2.3设有文法G[S]:S∷=SS*|SS+|a,写出符号串aa+a*规范推导,并构造语法树。 S => SS* => Sa* => SS+a* => Sa+a* => aa+a* 2.4 已知文法G[Z]:Z∷=U0∣V1 、 U∷=Z1∣1 、 V∷=Z0∣0 ,请写出全部由此文法描述的只含有四个符号的句子。 Z=>U0=>Z10=>U010=>1010 Z=>U0=>Z10=>V110=>0110 Z=>V1=>Z01=>U001=>1001 Z=>V1=>Z01=>V101=>0101 2.5 已知文法G[S]: S∷=AB A∷=aA︱ε B∷=bBc︱bc , 写出该文法描述的语言。 A∷=aA︱ε描述的语言: {a n|n>=0} B∷=bBc︱bc描述的语言:{b n c n|n>=1} L(G[S])={a n b m c m|n>=0,m>=1} 2.6 已知文法E∷=T∣E+T∣E-T 、 T∷=F∣T*F∣T/F 、 F∷=(E)∣i,写出该文法的开始符号、终结符号集合V T、非终结符号集合V N。 开始符号:E V t={+, - , * , / ,( , ), i} V n={E , F , T}
编译原理课后题答案 第二章 P36-6 (1) L G () 1是0~9组成的数字串 (2) 最左推导: 最右推导: P36-7 G(S) P36-8 文法: 最左推导: 最右推导: 语法树:/******************************** *****************/ P36-9 句子iiiei有两个语法树: P36-10 /************** ***************/ P36-11 /*************** L1: L2: L3: L4: ***************/ 第三章习题参考答案P64–7 (1)
最小化: P64–8 (1) (2) (3) P64–12 (a) a a,b a 0
给状态编号: a a a b b b 最小化: a a b b a b (b) 已经确定化了, 进行最小化 最小化: P64 –14 (1) 0 1 0 (2): (|)*010 1 εε 0 0 0 Y Y
最小化: 0 1 1 1 0 0 第四章 P81–1 (1) 按照T,S 的顺序消除左递归 递归子程序: procedure S; begin if sym='a' or sym='^' then abvance else if sym='(' then begin advance;T; if sym=')' then advance; else error; end else error end; procedure T; begin S; T end;
procedure 'T; begin if sym=',' then begin advance; S;'T end end; 其中: sym:是输入串指针IP所指的符号advance:是把IP调至下一个输入符号error:是出错诊察程序 (2) FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T)={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T)={)} 预测分析表 是LL(1)文法 P81–2 文法: (1) FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#} FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#} (2)