当前位置:文档之家› 《编译原理》课程复习1

《编译原理》课程复习1

《编译原理》课程复习1
《编译原理》课程复习1

《编译原理》课程复习

五、计算题:

1、考虑下面程序

…………

Var a:integer;

Procedure S(X);

Var X:integer;

Begin

a:=a+1;

X:=a+X

End;

Begin

a:=5;

S(a);

Print(a)

End.

试问:若参数传递方式分别采取传名和传值时,程序执行后输出a的值是什么?

答:传名:a=12

传值:a=6

2、写出表达式(a+b*c)/(a+b)-d的逆波兰表示及三元式序列。

逆波兰表示:

abc*+ab+/d-

三元式序列:

①(*,b,c)

②(+,a,①)

③(+,a,b)

④(/,②,③)

⑤(-,④,d)

3、已知文法G(S)

S→a|∧|(T)

T→T,S|S

写出句子((a,a),a)的规范归约过程及每一步的句柄。

句型归约规则句柄

((a,a),a)S→a a

((S,a),a)T→S S

((T,a),a)S→a a

((T,S),a)T→T,S T,S

((S),a)T→S S

((T),a)S→S(T)(T)

(S,a)T→S S

(T,a)S→a a

(T,S)T→T,S T,S

(T)S→(T)(T)

S

4、写一个文法,使其语言是奇数集,且每个奇数不以0开头。

解:文法G(N):

N→AB|B

A→AC|D

B→1|3|5|7|9

D→B|2|4|6|8

C→0|D

5、设文法G(S):

S→(L)|a S|a

L→L,S|S

(1) 消除左递归和回溯;

(2) 计算每个非终结符的FIRST和FOLLOW;

(3) 构造预测分析表。

解:S→(L)|aS’

S’→S|ε

L→SL’

L’→SL’|ε

FIRST)S)={(,a}FOLLOW(S)={#,,,)}

FIRST(S’)={,a,ε}FOLLOW(S’)={#,,,)}

FIRST(L)={(,a}FOLLOW(L)={ )}

FIRST(L’)={,,ε}FOLLOW(L’)={ }}

6、While a>0 ∨b<0do

Begin

X:=X+1;

if a>0 then a:=a-1

else b:=b+1

End;

翻译成四元式序列。

解:

(1) (j>,a,0,5)

(2) (j,-,-,3)

(3) (j<,b,0,5)

(4) (j,-,-,15)

(5) (+,×,1,T1)

(6) (:=,T1,-,×)

(7) (j>,a,0,9)

(8) (j,-,-,12)

(9) (-,a,1,T2)

(10) (:=,T2,-,a)

(11) (j,-,-,1)

(12) (+,b,1,T3)

(13) (:=,T3,-,b)

(14) (j,-,-,1)

(15)

7、已知文法G(E)

E→T|E+T

T→F|T * F

F→(E)|i

(1) 给出句型(T * F+i)的最右推导及画出语法树;

(2) 给出句型(T * F+i)的短语、素短语。

解:(1) 最右推导:

E→T→F→(E)→(E+T)→(E+F)→(E+i) →(T+i)→(T*F+i)

(2) 短语:(T*F+i),T*F+i,T*F,i

素短语:T*F,i

8、设布尔表达式的文法为

E → E(1)∨E(2)

E → E(1)∧E(2)

E → i

假定它们将用于条件控制语句中,请(1) 改写文法,使之适合进行语法制导翻译和实现回填;(2) 写出改写后的短个产生式的语义动作。

解:(1) E0→E(1)

E→E0E(2)

EA→E(1)

E→EAE(2)

E→i

(2) E→E(1)

{BACKPATCH(E(1)·FC,NXQ);

E0·TC:=E(1)·TC}

E→E0E(2)

{E·FC:=E(2)·FC;

E·TC:=MERG(E0·TC,E(2)·TC)}

EA→E(1)

{BACKPA TCH(E(1)·TC,NXQ);

E0·FC:=E(1)·FC}

E→EAE(2)

{E·TC:=E(2)·TC;

E·FC:=MERG(EA·FC,E(2)·FC}

E→i

{E·TC:=NXQ;E·FC:=NXQ+1;

GEN(jn2,entry(i),-0);

GEN(j,-,-,0)

9、设有基本块

T1:=2

T2:=10/T

T3:=S-R

T4:=S+R

A:=T2 * T4

B:=A

T5:=S+R

T6:=T3 * T5

B:=T6

假设基本块出口时只有A,B还被引用,请写出优化后的四元序列。

解:优化后的四元式

T3:=S-R

T4:=S+R

A:=5*T4

B:=T3*T4

10、给定文法G=({S,L},{a,(,)},{S→(L)|a L→L,S|S},S)。给出句型”(S,(a))”的推导和语法树并指出此句型的所有短语、直接短语、句柄和素短语。

解:ST(L) T(L,S) T(L,(L)) T(L,(S)) T(L,(a)) T(S,(a))

短语有:“a”,“(a)”,“S”,“S,(a)”,“(S,(a))”。

直接短语有:”S”,“a”

句柄:“S”

素短语:“a“

语法树略。

11、设语言L是由奇数个a和偶数(可以是0)个b组成的符号串之集。

(1)构造识别L的DFA;

(2)给出定义L的正规文法;

解:(1)见图:

(2)S→aA|bB A→aS|bC|e B→bS|aC C→bA|aB

12、将文法G[S]:S→[A A→AS|B] B→Bi|i 改写为等价的LL(1)文法,并给出相应的LL(1)分析表。

解:B→iC C →iC |e A→B]A’ A’ →ASA’ | e S→[A

First(ASA’)={i}, FOLLOW(A’)={ [ ]

FIRST(iC)={i}, FOLLOW(C) ={ }}

可知文法满足LL(1)文法的条件。

分析表:

13、化简文法G[S] :

S → ASe | BCaD | aD | AC

A → Cb | D BS

C → bC | d

B → Ac

D → aD

解:化简后:S → ASe|AC A → Cb C → bC | d

14、设L í {a,b,c}* 是满足下述条件的符号串构成的语言:

(1)若出现a ,则其后至少紧跟两个c ;

(2)若出现b ,其后至少紧跟一个c 。

试构造识别L 的最小化的DFA ,并给出描述L 的正规表达式。

解:DFA 如图所示。相应的正规式为(c|acc|bc)* 。

15、已给文法G[S] :S → SaP | Sf | P P → qbP | q

将G[S] 改造成LL ( 1 )文法,并给出LL ( 1 )分析表。

解:改造后的文法:S → PS' S' → aPS'| fS' | e P → qP' P' → bP | e 各候选式的FIRST 集,各非终结符的FOLLOW 集为

产生式FIRST 集FOLLOW 集

S → PS' {q} {#}

S' → aPS' → fS'

→ e {a}

{f}

{ e }

{#}

P → qP' {q} {a,f,#}

P' → bP → e {b}

{ e }

{a,f,#}

LL(1) 分析表为

16、给定文法G[S] :S → Aa|dAb|Bb|dBa A → c B → c,构造文法G[S] 的LR (1 )分析表。

解:分析表如下图所示

17、将下面的条件语句表示成逆波兰式和四元式序列:

if a>b then x:=a+b*c else x:=b-a;

解:(1 )逆波兰式:

( 2 )四元式:

(1) ( j>, a, b, (3))

(2) ( j, , , (7) )

(3) ( *, b, c, T1)

(4) ( +, a, T1, T2)

(5) ( :=, T2, , x)

(6) ( j, , , (9))

(7) ( -, b, a, T3)

(8) ( :=, T3, , x)

(9) ( … … )

18、给定基本块:

A:=3*5

B:=E+F

C:=A+12

D:=E+F

A:=D+12

C:=C+1

E:=E+F

假定出基本块后,只有 A 、 C 、 E 是活跃的,给出用DAG 图完成优化后的代码序列。

解:化简后的的四元式序列为

D:=E+F

A :=D+12

E :=E+F

C :=28

19、试构造生成语言L={a n b n c i|n 1, i 0}的文法

解:G(Z): Z→AB

A →aAb|ab

B →cB|ε

20、已知语言L={a n bb n| n 31}, 写出产生L的文法。

[解]:

G[S]: S →aAb

A→aAb|b

21、已知文法G=({A,B,C},{a,b,c},A,P),其中产生式P由以下组成:

A→abc A→aBbc

Bb→bB Bc→Cbcc

bC→Cb aC→aaB

aC→aa

问:此文法表式的语言是什么?

[解]:由于A为开始符。

由于A→aBbc→abBc→abCbcc→aCbbcc→aabbcc

语言为:{a n b n c n, n>0 }

22、试构造语言L={a n b n c i | n>=1, i>=0}的文法。

[解]:G(Z): Z→AB

A→aAb|ab

B→cB|ε

23、试写一文法,使其描述的语言L(G) 是能被5整除的整数集合。

解:G(Z): Z→(+|- )A(0|5)

A→0|1|2|3|4|5|6|7|8|9|AA|e

24、已知语言L={x | x?{a,b,c}*,且x重复排列是对称的(aabcbaa,aabbaa,等) 写出该语言的文法。

解:

G(Z):Z→aZa|bZb|cZc|a|b|c|ε

25、写能被5整除的十进制整数的文法及正则表达式。

解:能被5整除的文法:

G[Z]: Z→(+|-)A(0|5)

A→0|1|2|3|4|5|6|7|8|9|AA|ε

如果要求:除零以外不以0开头,则文法为:

G[Z]: Z→(+|- ) A (0|5)

A→AB|C

B→0|C|BB

C→0|1|2|3|4|5|6|7|8|9

正则表达式:G[Z]: Z= (+| - )A*(0|5)

A∈(0,1,2,3,4,5,6,7,8,9)

26、写一个文法,使其语言是奇数集,且每个奇数不以0开头。

解:文法G(N):

N→AB|B

A→AC|D

B→1|3|5|7|9

D→B|2|4|6|8

C→0|D

27、写出能被3整除十进制整数的文法和正则表达式:解:能被3整除的文法:

G=( {0,1,2,3,4,5,6,7,8,9},{S, A, B}, S, P,) 其中P为:S →(0|3|6|9)S|ε

S →(1|4|7)A|(2|5|8)B

A →(0|3|6|9)A|(1|4|7)B|(2|5|8)S

B →(0|3|6|9)B|(2|5|8)A|(1|4|7)S

正则表达式:

Z= a*| (bc)*|(cb)*|(a|c i b i)*|(c i ab i)*(i>= 1)

a∈(0,3,6,9)

b∈(1,4,7)

c∈(2,5,8)

28、写一文法,使其语言是偶正整数的集合

要求:

(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

29、已知文法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

语法树见下图:

<表达式> <项> <因子>

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

30、为句子i+i*i构造两棵语法树,从而证明下述文法G[<表达式>]是二义的。

<表达式>::=i|(<表达式>)|<表达式><运算符><表达式>

<运算符>::=+|-|*|/

解:为句子i+i*i构造的两棵语法树如下:

<表达式>

<表达式> + <表达式>

i<表达式> * <表达式>

i i

<表达式>

<表达式> * <表达式> <表达式> + <表达式>

i i

i

所以,该文法是二义的。

31、令文法G[E]为:

E→T|E+T|E-T

T→F|T*F|T/F

F→(E)|i

证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。解:可为E+T*F构造一棵语法树(见下图),所以它是句型。

E

E + T

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。

32、构造下列正规式相应的DFA:

(1)1(0|1)* 101

(2)1(1010* | 1(010)* 1)* 0

解:

(1)1(0|1)* 101对应的NFA为

0 0

0,1 (2)1(1010* | 1(010)* 1)* 0对应的NFA为

33、已知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图如下

下面将该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可以区分,有

P11={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如下:34、将下图确定化:

0,1 解:下表由子集法将NFA转换为DFA:

0,1 35、把下图的(a)和(b)分别确定化和最小化:

a

(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所在的行。)

a a

(a1)确定化的DFA (a2)最小化的DFA

(b):该图已经是DFA。下面将该DFA最小化:

(6)首先将它的状态集分成两个子集:P1={0},P2={1,2,3,4,5}

(7)区分P2:由于F(4,a)=0属于终态集,而其他状态输入a后都是非终态集,所以区分P2

如下:P21={4},P22={1,2,3,5}。

(8)区分P22:由于F(1,b)=F(5,b)=4属于P21,而F(2,b)与F(3,b)不等于4,即不属于P21,所

以区分P22如下:P221={1,5},P222={2,3}。

(9)区分P221:由于F(1,b)=F(5,b)=4,即F(1,a)=1,F(5,a)=5,所以1,5等价。

(10)区分P222:由于F(2,a)=1属于P221,而

F(3,a)=3属于P222,所以2,3可区分。P222区分为P2221{2},P2222{3}。

(11)结论:该DFA的状态集可分为:P={ {0},{1,5},{2},{3},{4} },其中1,5等价。删去

状态5,将原来引向5的引线引向与其等价的状态1,有图(b1)。

(b1)最小化的DFA

36、构造一个DFA,它接收Σ={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。然后再构造该语言的正则文法。

解:根据题意,DFA所对应的正规式应为:(0|(10))*。所以,接收该串的NFA如下:

显然,A,B等价,所以将上述DFA最小化后有:

对应的正规文法为:

G[A]:

A→1C|0A|ε

C→0A

37、给出下述文法所对应的正规式:

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)为所求的正规式。

38、对文法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)#的分析过程

39、对下面的文法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/→ε

《编译原理》模拟期末试题汇总 6套,含答案

《编译原理》模拟试题一 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.计算机高级语言翻译成低级语言只有解释一种方式。(×) 2.在编译中进行语法检查的目的是为了发现程序中所有错误。(×) 3.甲机上的某编译程序在乙机上能直接使用的必要条件是甲机和乙机的操作系统功能完全相同。 (√ ) 4.正则文法其产生式为 A->a , A->Bb, A,B∈VN , a 、b∈VT 。 (×) 5.每个文法都能改写为 LL(1) 文法。 (√) 6.递归下降法允许任一非终极符是直接左递归的。 (√) 7.算符优先关系表不一定存在对应的优先函数。 (×) 8.自底而上语法分析方法的主要问题是候选式的选择。 (×) 9.LR 法是自顶向下语法分析方法。 (×) 10.简单优先文法允许任意两个产生式具有相同右部。 (×) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.一个编译程序中,不仅包含词法分析,_____,中间代码生成,代码优化,目标代码生成等五个部分。 A.( ) 语法分析B.( )文法分析C.( )语言分析D.( )解释分析 2.词法分析器用于识别_____。 A.( ) 字符串B.( )语句 C.( )单词 D.( )标识符 3.语法分析器则可以发现源程序中的_____。 A.( ) 语义错误 B.( ) 语法和语义错误 C.( ) 错误并校正D.( ) 语法错误 4.下面关于解释程序的描述正确的是_____。

(1) 解释程序的特点是处理程序时不产生目标代码 (2) 解释程序适用于 COBOL 和 FORTRAN 语言 (3) 解释程序是为打开编译程序技术的僵局而开发的 A.( ) (1)(2) B.( ) (1)C.( ) (1)(2)(3) D.( ) (2)(3) 5.解释程序处理语言时 , 大多数采用的是_____方法。 A.( ) 源程序命令被逐个直接解释执行 B.( ) 先将源程序转化为中间代码 , 再解释执行 C.( ) 先将源程序解释转化为目标程序 , 再执行 D.( ) 以上方法都可以 6.编译过程中 , 语法分析器的任务就是_____。 (1) 分析单词是怎样构成的 (2) 分析单词串是如何构成语句和说明的 (3) 分析语句和说明是如何构成程序的 (4) 分析程序的结构 A.( ) (2)(3) B.( ) (2)(3)(4) C.( ) (1)(2)(3) D.( ) (1)(2)(3)(4) 7.编译程序是一种_____。 A. ( ) 汇编程序B.( ) 翻译程序 C.( ) 解释程序 D.( ) 目标程序 8.文法 G 所描述的语言是_____的集合。 A. ( ) 文法 G 的字母表 V 中所有符号组成的符号串 B.( ) 文法 G 的字母表 V 的闭包 V* 中的所有符号串 C.( ) 由文法的开始符号推出的所有终极符串 D. ( ) 由文法的开始符号推出的所有符号串 9.文法分为四种类型,即0型、1型、2型、3型。其中3型文法是_____。 A. ( ) 短语文法 B.( ) 正则文法 C.( ) 上下文有关文法 D.( ) 上下文无关文法 10.一个上下文无关文法 G 包括四个组成部分,它们是:一组非终结符号,一组终结符号,一个开始符号,以及一组 _____。 A.( ) 句子B.( ) 句型 C.( ) 单词 D.( ) 产生式 三、填空题(每空1分,共10分)

五套编译原理期末考试试卷及复习资料

得分一.填空题(每空2分,共20分) 1. 不同的编译程序关于数据空间的存储分配策略可能不同,但大部分编译中采用的方案有两 种:静态存储分配方案和动态存储分配方案,而后者又分为(1)和(2)。 2.规范规约是最(3)规约。 3.编译程序的工作过程一般划分为 5 个阶段:词法分析、(4)、语义分析与中间代码生成,代码优化及(5)。另外还有(6)和出错处理。 4.表达式 x+y*z/(a+b)的后缀式为(7)。 5.文法符号的属性有综合属性和(8)。 6.假设二位数组按行存放,而且每个元素占用一个存储单元,则数组 a[1..15,1..20]某个元素 a[i,j]的地址计算公式为(9)。 7.局部优化是局限于一个(10)范围内的一种优化。 得分二.选择题(1-6为单选题,7-8为多选题,每问2分,共20分) 1. 一个上下文无关文法 G 包括四个组成部分:一组终结符,一组非终结符,一个(),以 及一组()。 A.字符串B.产生式C.开始符号D.文法 2.程序的基本块是指()。 A.一个子程序B.一个仅有一个入口和一个出口的语句 C.一个没有嵌套的程序段D.一组顺序执行的程序段,仅有一个入口和一个出口 3. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。 A.自左向右B.自顶向下C.自底向上D.自右向左 4.在通常的语法分析方法中,()特别适用于表达式的分析。 A.算符优先分析法B. LR 分析法 C.递归下降分析法D. LL(1)分析法 5.经过编译所得到的目标程序是()。 A.四元式序列B.间接三元式序列 C.二元式序列D.机器语言程序或汇编语言程序 6.一个文法所描述的语言是();描述一个语言的文法是()。 A.唯一的B.不唯一的C.可能唯一,也可能不唯一

编译原理期末考试卷

2001年编译原理试题 1.(10分)处于/* 和 */之间的串构成注解,注解中间没有*/。画出接受这种注解的DFA的状态转换图。 2.(10分)为语言 L ={a m b n | 0 ≤ m ≤ 2n}(即a的个数不超过b的个数的两倍) 写一个LR(1)文法,不准超过6个产生式。(若超过6个产生式,不给分。若所写文法不是LR(1)文法,最多给5分。) 3.(10分)构造下面文法的LL(1)分析表。 D → TL T → int | real L → id R R → , id R | ε 4.(15分)就下面文法 S → ( L) | a L → L , S | S ?给出一个语法制导定义,它输出配对括号的个数。 ?给出一个翻译方案,它输出每个a的嵌套深度。 如句子(a, (a, a) ),第一小题的输出是2,第二小题的输出是1 2 2。 5.(10分)Pascal语言for语句的含义见教材第222页习题7.13。请为该语句设计一种合理的中间代码结构。你可以按第215页图7.17的方式或者第219页图7.19的方式写出你的设计,不需要写产生中间代码的语法制导定义。 6.(5分)一个C语言程序如下: func(i1,i2,i3) long i1,i2,i3; { long j1,j2,j3; printf("Addresses of i1,i2,i3 = %o,%o,%o\n",&i1,&i2,&i3); printf("Addresses of j1,j2,j3 = %o,%o,%o\n",&j1,&j2,&j3); } main() { long i1,i2,i3;

编译原理实验词法解析总结器的设计及实现.doc

南华大学 计算机科学与技术学院 实验报告 ( 2018~2019学年度第二学期) 课程名称编译原理 实验名称词法分析器的设计与 实现 姓名学号

专业班级 地点教师 1.实验目的及要求 实验目的 加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 实验要求 1.对单词的构词规则有明确的定义; 2.编写的分析程序能够正确识别源程序中的单词符号; 3.识别出的单词以 <种别码,值 >的形式保存在符号表中,正确设计和维护 符号表; 4.对于源程序中的词法错误,能够做出简单的错误处理,给出简单的错误 提示,保证顺利完成整个源程序的词法分析; 2.实验步骤 1.词法分析规则 <标识符 >::=< 字母 >|< 标识符 ><字母 >|< 标识符 ><数字 >

<常数 >::=< 数字 >|< 数字序列 ><数字 > <数字序列 >:: =<数字序列 ><数字 >|< 数字 >|<.> <字母 >::=a|b|c|??|x|y|z <数字 >::=0|1|2|3|4|5|6|7|8|9 <运算符 >::=< 关系运算符 >|< 算运算符 >|< 运算符 >|< 位运算符 >|< 运算符 > <算数运算符 >:: =+|-|*|/|...|-- <关系运算符 >:: =<|>|!=|>=|<=|== <运算符 >::=&&| || |! <位运算符 >::=&| | |! <运算符 >::==|+=|-=|/=|*= <分界符 >:: = ,|;|(|)|{|}|:| // |/**/ <保留字 >:: = main|if|else|while|do|for|...|void 2.符号的 符号种符号种 main0>26 if1>=27 else2<28 while3<=29 do4!30 for5!=31

编译原理考试试卷

一、填空题(每空 2 分,共 30 分) 1、编译程序的整个过程可以从逻辑上划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等几个阶段,另外还有两个重要的工 作是表格管理和出错处理 2、规范规约中的可归约串是句柄,算符优先分析中的可归约串是最左素短语。 3、语法分析方法主要可分为自顶向下和自底向上两大类。 4、 LR ( 0)文法的项目集中不会出现移进 -归约冲突和归约 -归约冲突。 5、数据空间的动存态储分配方式可分为栈式和堆式两种。 6、编译程序是指能将源语言程序翻译成目标语言程序的程序。 7、确定有穷自动机DFA 是NFA的一个特例。 8、表达式 (a+b)*c的逆波兰表示为ab+c*。 二、选择题(每题 2 分,共 20 分) 1、 L R 语法分析栈中存放的状态是识别B的 DFA 状态。 A 、前缀B、可归前缀C、项目 D 、句柄 2、D不可能是目标代码。 A 、汇编指令代码 B 、可重定位指令代码 C、绝对机器指令代码 D 、中间代码 3、一个控制流程图就是具有C的有向图 A 、唯一入口结点B、唯一出口结点C、唯一首结点 D 、唯一尾结点 4、设有文法G[S] : S→ b|bB B → bS ,则该文法所描述的语言是C。 A 、 L ( G)={b i|i≥ 0}B、 L (G) ={b 2i |i≥0} C、 L ( G)={b 2i+1|i≥ 0} D 、 L ( G)={b 2i+1|i ≥1} 5、把汇编语言程序翻译成机器可执行的目标程序的工作是由 B完成的。 A 、编译器 B 、汇编器C、解释器D、预处理器6、在目标代码生成阶段,符号表用于D。 A 、目标代码生成 B 、语义检查C、语法检查D、预处理器地址分配0 7、规范归约是指B。 A 、最左推导的逆过程 B 、最右推导的逆过程C、规范推导D、最左归约逆过程 8、使用A可以定义一个程序的意义。 A 、语义规则B、词法规则C、语法规则D、左结合规则 9、经过编译所得到的目标程序是D。 A 、三元式序列B、四元式序列C、间接三元式 D 、机器语言程序或汇编语言程序 10、在一个基本块内进行的代码优化是B。 A 、全局优化B、局部优化C、循环优化D、代码外提 三、简答题( 3 小题,共 30 分) 1、已知文法G[S]:S→Ac|aB A→ ab B→ bc 证明该文法具有二义性(本题 6 分) 证明:因为该文法的句型abc 存在如下两棵语法树: 所以,该文法具有二义性 一、填空题(每空 1分,共 20分) 1.编译过程一般分为、、中间代码生成、 和目标代码生成五个阶段。 2.语法分析最常用的两类方法是和分析法。 3.确定的有穷自动机是一个,通常表示为。

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

编译原理模拟试题六

《编译原理》模拟试题六 一、是非题(请在括号内,正确的划√,错误的划×)(每个2分,共20分) 1.设r和s分别是正规式,则有L(r|s)=L(r)L(s)。(×) 2.确定的自动机以及不确定的自动机都能正确地识别正规集。(√) 3.词法分析作为单独的一遍来处理较好。 (× ) 4.构造LR分析器的任务就是产生LR分析表。 (√) 5.规范归约和规范推导是互逆的两个过程。 (× ) 6.同心集的合并有可能产生新的“移进”/“归约”冲突。 (× ) 7.LR分析技术无法适用二义文法。 (× ) 8.树形表示和四元式不便于优化,而三元式和间接三元式则便于优化。 (×) 9.程序中的表达式语句在语义翻译时不需要回填技术。 (√) 10.对中间代码的优化依赖于具体的计算机。 (× ) 二、选择题(请在前括号内选择最确切的一项作为答案划一个勾,多划按错论)(每个4分,共40分) 1.编译程序绝大多数时间花在_____ 上。 A.( ) 出错处理 B.( ) 词法分析 C.( ) 目标代码生成D.( ) 表格管理 2.编译程序是对_____。 A.( ) 汇编程序的翻译 B.( ) 高级语言程序的解释执行 C.( ) 机器语言的执行D.( ) 高级语言的翻译

3.采用自上而下分析,必须_____。 A.( ) 消除左递归 B.( ) 消除右递归 C.( ) 消除回溯 D.( ) 提取公共左因子 4.在规范归约中,用_____来刻画可归约串。 A.( )直接短语B.( )句柄 C.( )最左素短语D.( )素短语 5.若a为终结符,则A->α ·aβ为_____项目。 A.( )归约B.( ) 移进C.( ) 接受D.( ) 待约 6.间接三元式表示法的优点为_____。 A.( ) 采用间接码表,便于优化处理B.( ) 节省存储空间,不便于表的修改 C.( ) 便于优化处理,节省存储空间 D.( ) 节省存储空间,不便于优化处理 7.基本块内的优化为_____。 A. ( ) 代码外提,删除归纳变量B.( ) 删除多余运算,删除无用赋 值 C.( ) 强度削弱,代码外提 D.( ) 循环展开,循环合并 8. 在目标代码生成阶段,符号表用_____。 A.( ) 目标代码生成B.( ) 语义检查 C.( ) 语法检查D.( ) 地址分配 9.若项目集Ik含有A->α·,则在状态k时,仅当面临的输入符号a∈FOLLOW(A)时,才采取“A->α ·”动作的一定是_____。

编译原理实验题目及报告要求

编译原理上机实验试题 一、实验目的 通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术, 如何针对确定的有限状态自动机进行编程序;熟悉和 掌握程序设计语言的语法分析程序的设计原理、熟悉 和掌握算符优先分析方法。 二、实验要求 本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告); ③要编写出完成相应任务的程序并在计算机上准确 地运行;④实验结束后要写出上机实验报告。 三、实验题目 针对下面文法G(S): S→v = E E→E+E│E-E│E*E│E/E│(E)│v │i 其中,v为标识符,i为整型或实型数。要求完成 ①使用自动机技术实现一个词法分析程序; ②使用算符优先分析方法实现其语法分析程序,在 语法分析过程中同时完成常量表达式的计算。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第一项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理: (1)单词分类:标识符,保留字,常数,运算符,分隔符等等 (2)单词类型编码 (3)自动机 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第二项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理:构造出算法优先关系表 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

最新编译原理期末考试试卷及答案

编译原理期末考试试卷及答案 1. 不同的编译程序关于数据空间的存储分配策略可能不同,但大部分编译中采用的方案有两种: 静态存储分配方案和动态存储分配方案,而后者又分为(1) 和 (2) . 2. 规范规约是最(3)规约. 3. 编译程序的工作过程一般划分为5个阶段:词法分析、(4) 、语义分析与中间代码生成,代码优化及(5) .另外还有(6)和出错处理. 4.表达式x+y*z/(a+b)的后缀式为 (7) . 5.文法符号的属性有综合属性和 (8). 6.假设二位数组按行存放,而且每个元素占用一个存储单元,则数组a[1..15,1..20]某个元素a[i ,j]的地 址计算公式为(9). 7.局部优化是局限于一个(10)范围内的一种优化. 二. 选择题(1-6为单选题,7-8为多选题,每问2分,共20分) 1. 一个上下文无关文法G 包括四个组成部分:一组终结符,一组非终结符,一个( ),以及 一组( ). A . 字符串 B . 产生式 C . 开始符号 D . 文法 2.程序的基本块是指( ). A . 一个子程序 B . 一个仅有一个入口和一个出口的语句 C . 一个没有嵌套的程序段 D . 一组顺序执行的程序段,仅有一个入口和一个出口 3. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于( )分析方法. A . 自左向右 B . 自顶向下 C . 自底向上 D . 自右向左 4.在通常的语法分析方法中,( )特别适用于表达式的分析. A . 算符优先分析法 B . LR 分析法 C . 递归下降分析法 D . LL (1)分析法 5.经过编译所得到的目标程序是( ). A . 四元式序列 B . 间接三元式序列 C . 二元式序列 D . 机器语言程序或汇编语言程序 6. 一个文法所描述的语言是( );描述一个语言的文法是( ). A . 唯一的 B . 不唯一的 C . 可能唯一,也可能不唯一 7. 如果在文法G 中存在一个句子,当其满足下列条件( )之一时,则称该文法是二义文法. A . 其最左推导和最右推导相同 B . 该句子有两个不同的最左推导 C . 该句子有两个不同的最右推导 D . 该句子有两棵不同的语法树 E . 该句子对应的语法树唯一 8. 下面( )语法制导翻译中,采用拉链—回填技术. A. 赋值语句 B. 布尔表达式的计算 C. 条件语句 D. 循环语句

编译原理实验指导书

编译原理实验指导 书

《编译原理》实验指导书 太原科技大学计算机学院 -3-1

序 《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计和算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译原理和技术的基本概念、基本原理和实现方法,实践环节非常重要,只有经过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。 为了配合《编译原理》课程的教学,考虑到本课程的内容和特点,本指导书设置了七个综合性实验,分别侧重于词法分析、NFA的确定化、非递归预测分析、算符优先分析器的构造、LR分析、语义分析和中间代码的生成、基于DAG的基本块优化,以支持编译程序的各个阶段,基本涵盖了《编译原理》课程的主要内容。 本指导书可作为《编译原理》课程的实验或课程设计内容,在课程教学的同时,安排学生进行相关的实验。实验平台可选择在MS-DOS或Windows操作系统环境,使用C/C++的任何版本作为开发工具。学生在做完试验后,应认真撰写实验报告,内容应

包括实验名称、实验目的、实验要求、实验内容、测试或运行结果等。

目录 实验一词法分析 ........................................................... 错误!未定义书签。实验二 NFA的确定化.................................................... 错误!未定义书签。实验三非递归预测分析 ............................................... 错误!未定义书签。实验四算符优先分析器的构造................................... 错误!未定义书签。实验五 LR分析 .............................................................. 错误!未定义书签。实验六语义分析和中间代码生成................................ 错误!未定义书签。实验七基于DAG的基本块优化................................... 错误!未定义书签。

编译原理期末考试习题及答案知识分享

一、填空题|(每题4分,共20分) 1. 乔母斯基定义的3型文法(线性文法)产生式形式 A→Ba|a,或A→aB|a,A,B∈Vn, a,b∈Vt 。 2.语法分析程序的输入是单词符号,其输出是语法单位。 3 型为 B → .aB 的LR(0)项目被称为移进项目,型为 B → a.B 的LR(0) 项目被称为待约项目, 4.在属性文法中文法符号的两种属性分别为继承属性和综合属性。 5、运行时存贮管理方案有静态存储分配、动态存储分配和堆式存储分配和方案。 二.已知文法 G(S) (1) E → T | E+T (2) T → F | F*F (3) F →(E)| i (1)写出句型(T*F+i)的最右推到并画出语法树。(4分) (2)写出上述句型的短语,直接短语和句柄。(4分) 答:(1)最右推到(2分) E ==> T ==> F ==> (E) ==> (E+T) ==> (E+F) ==> (E+i) ==> (T+i) ==> (T*F+i) (2) 语法树(2分) (3)(4分) 短语:(T*F+i),T*F+i ,T*F , i 直接短语:T*F , i 句柄:T*F 三. 证明文法G(S) :S → SaS |ε是二义的。(6分) 答:句子aaa对应的两颗语法树为: 因此,文法是二义文法

四.给定正规文法G(S): (1) S → Sa | Ab |b (2) A → Sa 请构造与之等价的DFA。(6分) 答:对应的NFA为:(6分) 状态转换表: a b {F} Φ{S} {S} {S,A} Φ {S,A} {S,A} {S} 五. 构造识别正规语言b*a(bb*a)*b* 最小的DFA(要求写出求解过程)。(15分)答:(1)对应的NFA(5分) a b {0} {1,3} {0} {1,3} Φ{2,3} {2,3} {1,3} {2,3} (5分) 六. 已知文法G(S) : (1) S → ^ | a | (T) (2) T → T,S | S 试:(1)消除文法的左递归;(4分) (2)构造相应的first 和 follow 集合。(6分) 答:(1)消除文法的左递归后文法 G’(S)为: (1) S → ^ | a | (T) (2) T → ST’ | S (3) T’→ ,ST’ |ε(4分)

编译原理实验 中间代码生成

实验四中间代码生成 一.实验目的: 掌握中间代码的四种形式(逆波兰式、语法树、三元式、四元式)。 二.实验内容: 1、逆波兰式定义:将运算对象写在前面,而把运算符号写在后面。用这种表示法表示的表 达式也称做后缀式。 2、抽象(语法)树:运算对象作为叶子结点,运算符作为内部结点。 3、三元式:形式序号:(op,arg1,arg2) 4、四元式:形式(op,arg1,arg2,result) 三、以逆波兰式为例的实验设计思想及算法 (1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。 (2)读入一个用中缀表示的简单算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。 (3)从左至右扫描该算术表达式,从第一个字符开始判断,如果该字符是数字,则分析到该数字串的结束并将该数字串直接输出。 (4)如果不是数字,该字符则是运算符,此时需比较优先关系。 做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将此运算符栈顶的运算符从栈中弹出,将该字符入栈。 (5)重复上述操作(1)-(2)直至扫描完整个简单算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。 四、程序代码: //这是一个由中缀式生成后缀式的程序 #include<> #include<> #include<> #include<> #define maxbuffer 64 void main() { char display_out(char out_ch[maxbuffer], char ch[32]); //int caculate_array(char out_ch[32]); static int i=0; static int j=0; char ch[maxbuffer],s[maxbuffer],out[maxbuffer]; cout<<"请输入中缀表达式: ";

编译原理试题

1997年编译原理试题 1.(10分)某操作系统下合法的文件名为 device:name.extension 其中第一部分(device:)和第三部分(.extension)可缺省,若device, name和extension都是字母串,长度不限,但至少为1,画出识别这种文件名的确定有限自动机。 2.(20分) a. 下面的二义文法描述命题演算公式,为它写一个等价的非二义文法。 S—> S and S | S or S | not S | p | q | (S) b. 下面文法是否为LL(1)文法?说明理由。 S—> A B | P Q x A—> x y B—> b c P—> d P | εQ—> a Q | ε 3.(10分)某些语言允许给出名字表的一个属性表,也允许声明嵌在另一个声明里面,下面文法抽象这个问题。 D —> attrlist namelist | attrlist (D) namelist —> id, namelist | id attrlist —> A attrlist | A A —> decimal | fixed | float | real D —> attrlist namelist的含义是:在namelist中的任何名字有attrlist 中给出的所有属性。D—> attrlist (D) 的含义是:在括号中的声明提到的所有名字有attrlist 中给出的所有属性,而不管声明嵌套多少层。写一个翻译方案,它将每个名字的属性个数填入符号表。为简单起见,若属性重复出现,则重复计数。4.(10分)把表达式 -(a+b)*(c+d)+(a+b+c) 翻译成四元式。 5.(10分)由于文法二义引起的LR(1)分析动作冲突,可以依据消除二义的规则而得到LR(1)分析表,根据此表可以正确识别输入串是否为相应语言的句子。对于非二义非LR(1)文法引起的LR(1)分析动作的冲突,是否也可以依据什么规则来消除LR(1)分析动作的冲突而得到LR(1)分析表,并且根据此表识别相应语言的句子?若可以,你是否可以给出这样的规则? 6.(5分)UNIX 下的C编译命令cc的选择项g和O的解释如下,其中dbx 的解释是“dbx is an utility for source-level debugging and execution of programs written in C”。试说明为什么用了选择项g后,选择项O便被忽略。 -g Produce additional symbol table information for dbx(1) and dbxtool(1) and pass -lg option to ld(1) (so as to include the g library, that is:

编译原理实验报告2

学生学号实验课成绩 武汉理工大学 学生实验报告书 实验课程名称编译原理 开课学院计算机科学与技术学院 指导老师姓名饶文碧 学生姓名 学生专业班级

—学年第学期 实验课程名称:编译原理 实验项目名称单词的词法分析实验成绩 实验者专业班级组别 同组者实验日期 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。 实验要求: (1)选择常用高级程序设计语言(如 Pascal、C语言、PL/0语言)的源程序作为词法分析对象。 (2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) #include #include #include #include char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch; //定义关键字 int lookup(char *TOKEN){ //关键字匹配函数 int m,i; for(i=1;i<6;i++){ if((m=strcmp(TOKEN,table[i]))==0) return(i); } return(0); } void out(int c,char *TOKEN){ //输出函数 printf("(%d,%s)\n",c,TOKEN); } void scanner(FILE *fp){ //扫描函数

编译原理考试试题1

编译原理 一、(5×6分)回答下列问题: 1.什么是S-属性文法?什么是L-属性文法?它们之间有什么关系? 2.什么是句柄?什么是素短语? 3.划分程序的基本块时,确定基本块的入口语句的条件是什么? 4.运行时的DISPLAY 表的内容是什么?它的作用是什么? 5.对下列四元式序列生成目标代码: A:=B*C D:=E+F G:=A+D H:=G*2 其中,H 是基本块出口的活跃变量, R0和R1是可用寄存器 二、(8分)设∑={0,1}上的正规集S 由倒数第二个字符为1的所有字符串组成,请给出该字集对应的正规式,并构造一个识别该正规集的DFA 。 三、(6分)写一个文法使其语言为L(G)={ a n b m a m b n | m,n ≥1}。 四、(8分)对于文法G(E): E →T|E+T T →F|T* F F →(E)|i 1. 写出句型(T*F+i)的最右推导并画出语法树。 2. 写出上述句型的短语,直接短语、句柄和素短语。 五、(12分)设文法G(S): ( |*)B B |B A A A |SiA S A →+→→ 1.构造各非终结符的FIRSTVT 和LASTVT 集合; 2.构造优先关系表和优先函数。 六、(9分)设某语言的do-while 语句的语法形式为 S → do S (1) While E 其语义解释为: 真 假 S (1)的代码 E 的代码

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式: (1) 写出适合语法制导翻译的产生式; (2) 写出每个产生式对应的语义动作。 七、(8分)将语句if (A0) then while C>0 do C:=C+D; 翻译成四元式。 八、(10分) 设有基本块如下: T1:=S+R T2:= 3 T3:= 12/T2 T4:=S/R A:=T1-T4 T5:=S+R B:=T5 T6:=T5*T3 B:=T6 (1)画出DAG图; (2)设A,B是出基本块后的活跃变量,请给出优化后的四元式序列。 九、(9分) 设已构造出文法G(S): (1) S → BB (2) B → aB (3) B→ b 的LR分析表如下 ACTION GOTO 状态 a b # S B 0 s3 s4 1 2 1 acc 2 s6 s7 5 3 s3 s 4 8 4 r3 r3 5 r1 6 s6 s 7 9 7 r3 8 r2 r2 9 r2 假定输入串为abab,请给出LR分析过程(即按照步骤给出状态,符号,输入串的变化过程)。

编译原理期末考试试卷及答案

期末考试试卷(A)卷 一、填空题(每小题2分,共20分) 1、字母表∑,用∑*表示∑上所有有穷长的串集合,∑*称为∑的①。 2、设z=abc,则z的固有头是①。 3、如何由语言基本符号组成程序中各个语法成分(包括程序)的一组规则叫 ①。 4、设∑={a,b},∑上的正规式(a|b)(a|b) 相应的正规集为① 5、NFA的映象f是从"状态×字"映射到"状态子集",f为①值函数。 6、LR分析是按规范句型的①为可归约串。 7、结点的①属性值由该结点的兄弟结点和父结点的属性值计算。 8、如果分析树中一结点的属性b依赖于属性c,那么这个结点的属性b的语义规 则的计算必须在定义属性c的语义规则的计算①。 9、对于栈式符号表,引入一个显示嵌套层次关系表- ①表,该表总是 指向当前正在处理的最内层的过程的子符号表在栈符号表中的起始位置。 10、任一有向边序列n1 → n2,n2 → n3,…,nk-1 → nk为从结点n1到结点nk 的一条通路。如果n1=nk,则称该通路为①。 二、单项选择(每小题2分,共14分) 1、乔姆斯基把文法分成4种类型,即0型、1型、2型和3型。其中3型文法也称 为()。 A.上下无关文法 B.正规文法 C.上下文有关文法 D.无限制文法 2、生成非0开头的正偶数集的文法是()。 A. Z::=ABC B. Z::=ABC C::=0|2|4|6|8 C::=0|2|4|6|8 B::=BA|B0|ε B::=BA|B0|0 A::=1|2|3|…|9 A::=1|2|3|…|9 C. Z::=ABC|2|4|6|8 D. Z::=ABC|2|4|6|8 C::=0|2|4|6|8 C::=0|2|4|6|8 B::=BA|B0|0 B::=BA|B0|ε A::=1|2|3|…|9 A::=1|2|3|…|9 3、简单优先分析法从左到右扫描输入串,当栈顶出现()时进归约。

编译原理实验报告:实验一编写词法分析程序

( 编译原理实验报告 , 实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:( 13软件四 姓名:丁越 学号: 实验地点:) 秋白楼B720

实验成绩: 日期:2016年 3 月 18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:[ 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 > (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 ¥ outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图 1-1。 …

编译原理模拟题

《编译原理》模拟题(补) 一.单项选择题 1.()是两类程序语言处理程序。 A. 高级语言程序和低级语言程序 B. 解释程序和编译程序 C. 编译程序和操作系统 D. 系统程序和应用程序 2. 编译程序前三个阶段完成的工作是()。 A. 词法分析、语法分析和代码优化 B. 代码生成、代码优化和词法分析 C. 词法分析、语法分析、语义分析和中间代码生成 D. 词法分析、语法分析和代码优化 3. 一个上下文无关文法G包括四个组成部分:一组终结符,一组非终结符,一个开始符号,以及一组()。 A. 字符串 B. 产生式 C. 非开始符号 D. 文法 4. 词法分析器的输出结果是()。 A. 单词的种别编码 B. 单词在符号表中的位置 C. 单词的种别编码和自身值 D. 单词自身值 5. 一个句型中称为句柄的是该句型的最左()。 A. 非终结符号 B. 短语 C. 句子 D. 直接短语 6. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于()分析方法。 A. 自左向右 B. 自顶向下 C. 自底向上 D. 自右向左 7. 在通常的语法分析方法中,()特别适用于表达式的分析。 A. 算符优先分析法 B. LR分析法 C. 递归下降分析法 D. LL(1)分析法 8. 优化可生成_____的目标代码。 A. 运行时间较短 B. 占用存储空间较小 C. 运行时间短但占用内存空间大 D. 运行时间短且占用存储空间小 9.()是两类程序语言处理程序。 A. 系统程序和应用程序 B.编译程序和操作系统 C. 解释程序和编译程序 D.高级语言程序和低级语言程序 10. 经过编译所得到的目标程序是()。 A. 四元式序列 B. 间接三元式序列

编译原理实验指导

编译原理实验指导书 主编:徐静李娜 信息与电气工程学院 2010年3月

概述 一、本课程实验的目的和任务 编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。 二、实验方法 任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实验将定义一个简化的语言── C语言的一个子集作为源语言,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。 三、实验报告的规范和要求 每个实验完成后写出实验报告。实验报告的内容包括如下内容: 一、实验目的 二、程序设计时采用的算法和方法 三、输入的源程序 四、词法分析程序清单和输出结果。 五、心得体会

实验一词法分析 一、实验目的: (1)通过设计编制调试一个具体的词法分析程序,理解词法分析在编译程序中的作用。 (2)加深对有穷自动机模型的理解。 (3)掌握词法分析程序的实现方法和技术。 (4)用C语言对一个简单语言的子集编制一个一遍扫描的程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示)。 二、实验预习提示 1. 词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种别码的方式。 2. 单词的BNF表示 <标识符>→ <字母><字母数字串> <字母数字串>→<字母><字母数字串>|<数字> <字母数字串>| <下划线><字母数字串>|ε <无符号整数>→<数字> <数字串> <数字串>→<数字><数字串>|ε <加法运算符>→+ <减法运算符>→- <大于关系运算符>→> <大于等于关系运算符>→>= 3. “超前搜索”方法

相关主题
文本预览
相关文档 最新文档