编译原理习题大全.docx

上传人:b****6 文档编号:6452012 上传时间:2023-01-06 格式:DOCX 页数:36 大小:247.14KB
下载 相关 举报
编译原理习题大全.docx_第1页
第1页 / 共36页
编译原理习题大全.docx_第2页
第2页 / 共36页
编译原理习题大全.docx_第3页
第3页 / 共36页
编译原理习题大全.docx_第4页
第4页 / 共36页
编译原理习题大全.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

编译原理习题大全.docx

《编译原理习题大全.docx》由会员分享,可在线阅读,更多相关《编译原理习题大全.docx(36页珍藏版)》请在冰豆网上搜索。

编译原理习题大全.docx

编译原理习题大全

第1章

1、编译过程包括哪几个主要阶段及每个阶段的功能。

答案:

编译过程包括词法分析、语法分析、语义分析和中间代码生成、优化、目标代码生成5个阶段。

词法分析的功能是对输入的高级语言源程序进行词法分析,识别其中的单词符号,确定它们的种类,交给语法分析器,即把字符串形式的源程序分解为单词符号串形式。

语法分析的功能是在词法分析结果的基础上,运用语言的语法规则,对程序进行语法分析,识别构成程序的各类语法范畴及它们之间的层次关系,并把这种层次关系表达成语法树的形式。

词义分析和中间代码生成的功能是在语法分析的基础上,对程序进行语义分析,“理解”其含义,产生出表达程序语义的内部表达形式(中间代码)。

优化的功能是按照等价变换的原则,对语义分析器产生的中间代码序列进行等价变换,删除其中多余的操作,对耗时耗空间的代码进行优化,以期最后得到高效的可执行代码。

目标代码生成的功能是把优化后的中间代码变换成机器指令代码,得到可在目标机器上执行的机器语言程序。

 

第2章

1、写一上下文无关文法G,它能产生配对的圆括号串(如:

(),(()),()(())等,甚至包括0对括号)

文法为:

S(L)|LS|LLS|

2、已知文法G:

EE+T|E-T|TTT*F|T/F|FF(E)|i

(1)给出i+i*i,i*(i-i)的最左推导,最右推导以及语法树。

(2)i-i+i哪个算符优先。

【解答】

(1)最左推导:

EE+TT+TF+Ti+Ti+T*Fi+F*Fi+i*Fi+i*i

ETT*FF*Fi*Fi*(E)i*(E-T)i*(T-T)i*(F-T)i*(i-T)i*(i-F)i*(i-i)

最右推导:

EE+TE+T*FE+T*iE+F*iE+i*iT+i*iF+i*ii+i*i

ETT*FT*(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:

EET+|TTTF*|FFFP↑|PPE|i

(1)试证明符号串TET+*i↑是G的一个句型(要求画出语法树).

(2)写出该句型的所有短语,直接短语和句柄.

【解答】

(1)采用最右推导:

ETFFP↑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:

SiSeS|iS|i,该文法是二义文法吗?

为什么?

【解答】该文法是二义文法。

因为对于句子iiiei存在两种不同的最左推导:

第1种推导:

SiSeSiiSeSiiieSiiiei

第2种推导:

SiSiiSeSiiieSiiiei

 

第3章

1、用正规式描述下列正规集:

(1)C语言的十六进制整数;

(2)以ex开始或以ex结束的所有小写字母构成的符号串;

(3)十进制的偶数。

【解答】

(1)C语言十六进制整数以0x或者0X开头,所以一般形式应该为(+|-|)(0x|0X)AA*,其中前面括号表示符号,可以有正号、负号,也可以省略(用表示)默认是正数,A表示有资格出现在十六进制整数数位上的数字,AA*表示一位或者多位(一个或者多个数字的串)。

下面进一步确定A的取值,A应该为(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|A|B|C|D|E|F),所以整个正规式应该为:

(+|-|)(0x|0X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|A|B|C|D|E|F)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|A|B|C|D|E|F)*

也可以写成:

A:

0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|A|B|C|D|E|F

(+|-|)(0x|0X)AA*

从上面看出,在用正规式描述正规集时,如本例题所示,采用自顶向下,逐步求精的方法,先描述正规集的一般规律,再对细节进行描述。

(2)以ex开始的小写字母符号串应该为ex(小写字母)*,以ex结尾的小写字母符号串应该为(小写字母)*ex,所以整个正规集描述为:

ex(小写字母)*|(小写字母)*ex。

(3)十进制偶数个位为0、2、4、6、8,前面其他数位为0、1、2、3、4、5、6、7、8、9,因此整个正规集表示为(+|-|)A*B,其中A表示(0|1|2|3|4|5|6|7|8|9),B表示(0|2|4|6|8),所以表示整个正规集的正规式为:

(+|-|)(0|1|2|3|4|5|6|7|8|9)*(0|2|4|6|8)

2、构造下列正规式所对应的确定有限自动机(需要化简):

(1)(aa|b)*(a|bb)*

(2)ab*c*d

(3)((a|b)*|bb)*

【解答】

(1)首先从该正规式出发,构造等价的非确定有限自动机,如图所示。

构造(aa|b)*(a|bb)*等价非确定有限自动机

得到了非确定有限自动机后,下面用子集法进行确定化,如下表所示。

状态子集

a

B

{X,1,0,2,Y}

{3,2,Y}

{1,4,0,2,Y}

{3,2,Y}

{1,2,0,Y}

{4}

{1,4,0,2,Y}

{3,2,Y}

{1,2,4,0,Y}

{1,2,0,Y}

{3,2,Y}

{1,4,0,2,Y}

{4}

-

{2,Y}

{2,Y}

{2,Y}

{4}

将状态子集重新命名,得到如下表所示的状态转换矩阵:

状态

a

b

0初态,终态

1

2

1终态

3

4

2终态

1

2

3终态

1

2

4

-

5

5终态

5

4

左上角{X}的闭包所对应的状态是确定有限自动机的初始状态,含有原非确定有限自动机终止状态Y的状态子集所对应的状态是确定有限自动机的终止状态。

这样,就得到如下图所示的确定有限自动机。

首先,状态集划分为终态集{0,1,2,3,5}和非终态集{4}。

其中第二个集合已经无法进一步划分。

下面考察第一个集合,看是否需要划分为不同的集合。

我们看到,在该集合中,状态1和5在输入b的情况下,后继状态为4,而0,2,3在相同输入的情况下,后继状态都为2,这两组状态在相同输入的情况下,后继状态分别属于当前划分的不同子集,说明它们是可以区分的,应该将{0,1,2,3,5,6}划分为两个子集:

{0,2,3}和{1,5},这样,得到状态集合的新划分:

{4},{0,2,3},{1,5}

下面考察,{0,2,3}和{1,5}是否可以进一步划分。

考察{0,2,3}:

在输入b的情况下,它们的后继状态都是2号状态,无法确定它们是可区分的;在输入a的情况下,0的后继状态是1,2和3的后继状态是1,说明1与2和3是等价的,因此删除2个状态。

同样考察{1,5}:

在输入b的情况下,它们的后继状态是4号状态,无法确定它们是可区分的;在输入a的情况下,1的后继状态是3,5的后继状态是5,而状态3同状态5不属于同一个集合,因此1与5是可区分的,将1和5分开,于是得到下面的划分:

{4},{0,2,3},{1},{5}。

经过考察,发现其中的每个状态子集都不可能进一步划分了,这样就得到了最后的划分。

对每个状态子集,选一个状态作为代表,删除其余状态,把导向被删除状态的边改成导向所选择的代表状态,就得到如下图所示的化简的确定有限自动机。

(2)首先从该正规式出发,构造等价的非确定有限自动机,如下图所示。

得到了非确定有限自动机后,下面用子集法进行确定化,如下表所示。

状态子集

a

b

c

D

{X}

{1,4,2,5,3}

{1,4,2,5,3}

{4,2,5,3}

{5,3}

{Y}

{4,2,5,3}

{4,2,5,3}

{5,3}

{Y}

{5,3}

{5,3}

{Y}

{Y}

将状态子集重新命名,得到下面的状态转换矩阵如下表所示。

状态

A

b

c

d

0初态

1

-

-

-

1

-

2

3

4

2

-

2

3

4

3

-

-

3

4

4终态

-

-

-

-

左上角{X}的闭包所对应的状态是确定有限自动机的初始状态,含有原非确定有限自动机终止状态Y的状态子集所对应的状态是确定有限自动机的终止状态。

这样,就得到如下图所示的正规式ab*c*d的未化简的确定有限自动机。

下面对确定有限自动机进行最小化:

首先,状态集划分为非终态集{0,1,2,3}和终态集{4}。

其中第2个集合无法进一步划分。

下面考察第1个集合{0,1,2,3},看是否需要划分为不同的集合。

在该集合中,状态0只能接受a,应该将{0,1,2,3}划分为两个子集:

{0}和{1,2,3},得到状态集合的新划分:

{4},{0},{1,2,3}

下面考察{1,2,3}是否可以进一步划分。

状态1,2可以接受字符b,c,d,状态3能接受c,d,所以应该将{1,2,3}分解为{1,2}和{3}。

于是得到新的划分:

{0},{1,2},{3},{4}

经过考察,发现其中的每个状态子集都不可能进一步划分了,得到了最后的划分。

对每个状态子集,选一个状态作为代表,删除其余状态,把导入被删除状态的边改成导向所选择的代表状态,得到如下图所示的正规式ab*c*d的的化简后的确定有限自动机。

(3)首先从该正规式出发,构造等价的非确定有限自动机,如下图所示。

 

得到了非确定有限自动机后,下面用子集法进行确定化,如下表所示。

状态子集

a

b

{X,1,3,Y}

{3,1,Y}

{2,3,1,Y}

{3,1,Y}

{3,1,Y}

{2,3,1,Y}

{2,3,1,Y}

{3,1,Y}

{2,3,1,Y}

将状态子集重新命名,得到下面的状态转换矩阵,如下表所示。

状态

a

b

0初态终态

1

2

1终态

1

2

2终态

1

2

左上角{X}的闭包所对应的状态是确定有限自动机的初始状态,含有原非确定有限自动机终止状态Y的状态子集所对应的状态是确定有限自动机的终止状态。

得到如下图所示的正规式((a|b)*|bb)*的未化简的确定有限自动机。

下面对确定有限自动机进行最小化:

首先,状态集划分为非终态集和终态集{0,1,2}。

考察集合{0,1,2},发现其中的每个状态子集都不可能进一步划分,得到最后的划分:

{0,1,2}。

对该状态子集,选一个状态作为代表,删除其余状态,把导入被删除状态的边改成导向所选择的代表状态,得到如下图所示的正规式((a|b)*|bb)*的化简后的确定有限自动机。

 

第4章

1、自上而下与自下而上的语法分析策略有什么区别?

【解答】自上而下语法分析是从文法开始符号出发,不断使用文法的产生式进行推导,分析成功的标志是推导出待分析的终结符号串。

而自下而上语法分析是从待分析的终结符号串出发,使用产生式规则,对当前的符号串(开始时是待分析的终结符号串),寻找其中的子串,利用规则A,将替换成A,得到新的符号串。

分析过程的主要操作是归约。

分析成功的标志是从给定的终结符号串出发,经过不断归约,得到文法起始符号。

2、对下列文法,构造预测分析表(如果含有左递归,则消除左递归;如果存在公共左因子,则提取公共左因子),如果是LL

(1)文法,则举例说明预测分析程序对句子进行语法分析的过程:

(1)SAS|bASA|a

(2)SAAAb|bBaBaAc|a|aAb

(3)SAaAb|BbBaAB

解答:

(1)该文法中含有左递归,消除后得到如下的文法:

SAS|b

AbAB|aB

BSAB|

该文法中没有公共左因子。

预测分析表为如下表所示。

SAS|b,ASA|a的预测分析表

a

B

#

S

SAS

SAS

Sb

A

AaB

AbAB

B

BSAB

B

BSAB

B

由于预测分析表中含有多重入口,因此给定文法不是LL

(1)文法。

(2)该文法存在左递归,消除后文法变成:

SA

AbBaC

CbC|

BaAc|a|aAb

关于B的规则中,不同候选之间存在公共左因子,提取后得到:

SA

AbBaC

CbC|

BaD

DAE|

Ec|b

构造出的预测分析表如下表所示。

SA,AAb|bBa,BaAc|a|aAb的预测分析表

a

B

C

#

S

SA

A

AbBaC

C

CbC

C

C

C

B

BaD

D

D

DAE

E

Eb

Ec

预测分析表中含有多重入口,因此,给定文法不是LL

(1)文法。

(3)该文法不含左递归,也无需提取公共左因子(没有公共左因子)。

下面计算FIRST集合和FOLLOW集合:

对于SAaAb|BbBa,每个候选的FIRST集合分别为FIRST(AaAb)={a},FIRST(BbBa)={b}。

对于A,其惟一候选的FIRST集合为FIRST()={}。

对于B,其惟一候选的FIRST集合为FIRST()={}。

每个非终结符的FOLLOW集合分别为FOLLOW(S)={#},FOLLOW(A)={a,b},FOLLOW(B)={a,b}。

因此,构造出如下表所示的预测分析表:

SAaAb|BbBa,A,B的预测分析表

a

B

#

S

SAaAb

SBbBa

A

A

A

B

B

B

预测分析表中不含多重入口,因此,给定文法为LL

(1)文法。

 

第5章

1、给定算符文法:

Sa||(T)

TT,S|S

(1)构造算符优先关系表;

(2)该文法是否为算符优先文法?

为什么?

如果是算符优先文法,请给出句子(a,(a,a))的算符优先分析过程(指出堆栈和缓冲区的变化)。

【解答】

(1)首先计算每个非终结符的FIRSTVT和LASTVT集合。

FIRSTVT(S)={a,,(}

FIRSTVT(T)={,,a,,(}

LASTVT(S)={a,,)}

LASTVT(T)={,,a,,)}

下面考察每个产生式的右部,寻找两个终结符相邻或者两个终结符中间夹一个非终结符,终结符后跟非终结符,以及非终结符后跟终结符的情况。

针对该文法,得到:

●(T),两个终结符中间夹一个非终结符,据此得到(=)。

●(T,终结符后跟非终结符,据此得到(

●T),非终结符后跟终结符,据此得到LASTVT(T)中的每个元素>),即,>),a>),>),)>)。

●T,,非终结符后跟终结符,据此得到LASTVT(T)中的每个元素>,,即,>,,a>,,>,,)>,。

●,S,终结符后跟非终结符,据此得到,

根据上面的分析,得到如下表所示的算符优先分析表。

a

#

a

>

>

>

>

>

>

<

<

<

<

=

>

<

<

<

>

>

>

>

>

>

#

<

<

<

<

<

=

(2)该文法是算符优先文法,对于任意的终结符对a、b,最多存在下列3种优先关系之一:

a>b,a=b,a

即优先关系表中不存在多重入口。

下面使用得到的优先关系表,利用算符优先分析算法,对句子(a,(a,a))进行语法分析。

经过初始化,堆栈栈顶只有#,缓冲区指针指向句子第一个终结符,并且在句子末尾附加了#作为句子结束标志。

堆栈和缓冲区具有如下的形式:

(1)由于#<(,所以应该移进,得到如下的情形:

(2)此时,栈顶第一个终结符为(,当前输入符号为a,由于(

(3)此时栈顶第一个终结符为a,当前输入符号为,,由于a>,,所以应该在栈顶寻找最左素短语,对其进行归约。

由于此时堆栈中(

(4)此时栈顶第一个终结符为(,当前输入符号仍然为,,由于(<,,所以应该移进,堆栈和缓冲区变成如下的情形:

(5)此时栈顶第一个终结符为,,当前输入符号为(,由于,<(,所以还是采取移进动作,得到:

(6)此时栈顶第一个终结符为(,当前输入符号为a,由于(

(7)此时栈顶第一个终结符为a,当前输入符号为,,由于a>,,所以应该在栈顶找最左素短语,对其进行归约。

由于此时堆栈中(

(8)此时栈顶第一个终结符为(,当前输入符号为,,由于(<,,所以应该移进:

(9)此时缓冲区第一个终结符为,,输入符号为a,由于,

(10)此时,栈顶第一个终结符为a,输入符号为),由于a>),所以应该归约。

由于,

(11)此时栈顶第一个终结符为,,当前符号为),由于,>),所以应该进行归约。

由于堆栈中(<,,所以当前句型的最左素短语为N,N,对其进行归约,得到:

(12)此时栈顶第一个终结符为(,当前输入符号为),由于(=),所以应该移进,得到:

(13)此时栈顶第一个终结符为),当前输入符号为),由于)>),所以应该进行归约。

由于此时堆栈中(=),而,<(,所以当前的最左素短语为栈顶的(N),对其进行归约,得到:

(14)此时栈顶的第一个终结符为,,当前输入符号为),由于,>),所以应该进行归约。

由于此时堆栈中(<,,所以当前的最左素短语为N,N,对其进行归约,得到:

(15)此时栈顶的第一个终结符为(,当前输入符号为),由于(=),所以应该移进,得到:

(16)此时栈顶的第一个终结符为),当前输入符号为#,由于)>#,所以应该进行归约。

由于此时堆栈中(=),#<(,所以当前的最左素短语为(N),对其进行归约,得到:

此时栈顶的第一个终结符为#,当前的输入符号也为#,标志分析成功。

2、课件第5章中练习题。

 

第6章

1、给定文法:

E(L)|a

LL,E|E

(1)构造识别活前缀的确定有限自动机(LR(0)项目集规范族);

(2)构造LR(0)分析表;

(3)构造SLR

(1)分析表;

(4)该文法是否为LR(0)文法?

为什么?

(5)该文法是否为SLR

(1)文法?

为什么?

(6)用SLR

(1)分析表对((a),a)进行LR语法分析,给出分析程序的每一步动作及缓冲区和堆栈的变化情况。

【解答】

(1)首先对文法进行拓广,得到如下的拓广文法:

<1>SE

<2>E(L)

<3>Ea

<4>LL,E

<5>LE

构造识别活前缀的确定有限自动机(LR(0)项目集规范族)如下图所示:

(2)LR(0)项目集规范族中有9个项目集(确定有限自动机的状态),所以LR(0)分析表应该有9行,每行对应一个状态。

假设用数字0~8分别对应I0~I8。

对于0号状态这一行,考察项目集I0,其中含3个项目,分别为待约项目SE,移进项目E(L)和Ea。

对于SE,由于GO(I0,E)=I1,所以在这一行E列(GOTO子表)中放置状态1;对于E(L),应该在(列放置移进动作,由于GO(I0,()=I2,所以应该设置s2;对于Ea,应该在a列放置移进动作,由于GO(I0,a)=I3,所以应该放置s3。

对于1号状态这一行,由于I1中只有接受项目,所以在这一行#列应该设置接受动作(acc)。

对于2号状态这一行,含有3个待约项目E(L),LL,E和LE,因此,根据它们填充GOTO子表,具体地,根据待约项目E(L)及GO(I2,L)=I4,在这一行L列放置状态号4,根据待约项目LL,E及GO(I2,L)也是在这一行L列放置状态号4,根据待约项目LE及GO(I2,E)=I8,在这一行E列放置状态号8。

此外,在这个项目集中还有两个移进项目E(L)和Ea,根据E(L)及GO(I2,()=I2,应该在这一行(列放置s2,根据Ea及GO(I2,a)=I3,应该在这一行a列放置s3。

对于3号状态,由于其中只含一个归约项目Ea,据此需要在这一行每个终结符对应的列上(动作子表的)放置用Ea进行归约的动作,即r3。

按照同样的方式考察其他状态,得到:

4号状态行)列(动作子表)放置状态号s5,,列(动作子表)放置s6;5号状态行动作子表每一列放置用E(L)进行归约的动作,即r2;6号状态行a列放置s3,(列放置s2,E列放置状态7;7号状态行动作子表每一列放置用LL,E进行归约的动作,即r4;8号状态行动作子表每一列放置用LE进行归约的动作,即r5。

根据前面的分析,可以得到如下表所示的LR(0)分析表:

状态

ACTION(动作)

GOTO(转移)

a

#

E

L

0

s3

s2

1

1

acc

2

s3

s2

8

4

3

r3

r3

r3

r3

r3

4

s5

s6

5

r2

r2

r2

r2

r2

6

s3

s2

7

7

r4

r4

r4

r4

r4

8

r5

r5

r5

r5

r5

(3)SLR

(1)分析表的构造与LR(0)只是在归约项目上有所不同。

在识别活前缀的确定有限自动机中,包含归约项目的状态(项目集)有4个,分别为I3、I5、I7和I8。

现在我们考察这些

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1