编译原理第一章练习和答案

发布时间:2020-07-12 14:26:08   来源:文档文库   
字号:

1设有文法G[S]:

Sa|T|

TT,S|S

(1) 试给出句子(a,a,a)的最左推导。

(2) 试给出句子(a,a,a)的分析树

(3) 试给出句子(a,a,a)的最右推导和最右推导的逆过程(即最左规约)的每一步的句柄。

【解】(1) (a,a,a)的最左推导

S=>(T) =>(T,S) =>( T,S,S) =>( S,S,S) =>(a,S,S) =>(a,a,S) =>(a,a,a)

2(a,a,a)的分析树

(3) (a,a,a)最右推导 最左规约每一步的句柄

S=>(T) 句柄为:(T)

=>(T,S) 句柄为:T,S

=>(T,a) 句柄为:a

=>(T,S,a) 句柄为:T,S

=>(T,a,a) 句柄为:第一个a

=>(S,a,a)      句柄为:S

=>(a,a,a)      句柄为:第一个a

2已知文法G[Z]:

Z0U|1V

U1Z|1

V0Z|0

(1) 请写出此文法描述的只含有4个符号的全部句子。

(2) G[Z]产生的语言是什么?

(3) 该文法在Chomsky文法分类中属于几型文法?

【解】(1010101101010 1001

2)分析G[Z]所推导出的句子的特点:由Z开始的推导不外乎图1所示的四种情形。

Z推导出1001后就终止或进入递归,而Z的每次递归将推导出相同的符号串:1001。所以G[Z]产生的语言L(G[Z])={x|x(10|01)+ }

(3)该文法属于3型文法。

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

Aabc

AaBbc

BbbB

BcCbcc

bCCb

aCaaB

aCaa

此文法所表示的语言是什么?

【解】

分析文法的规则:

每使用一次BcCbccbc的个数各增加一个;

每使用一次aCaaBaCaa, a的个数就增加一个;

产生式BbbB bCCb起连接转换作用。

由于A是开始符号,由产生式Aabc推导得到终结符号串abc;由产生式AaBbc推导得到B后,每当使用产生式BbbBBcCbccbCCbaCaaB就会递归调用B一次,所产生的abc的个数分别增加一个,因此推导所得的终结符号串为abcaabbccaaabbbccc、…所以文法描述的语言为{ anbncn|n>0}.

4 构造描述语言L(G[S])={nn|n0} 的文法。

【解】(1)找出语言的一些典型句子:

n=0 ε

n=1 ( )

n=2 (())

所以, L(G[S])={ ε( ) (())((()))、…}

(2)分析句子的特点:

只含有(),()的个数相同且对称, 句子中所含的符号数可无限, 句子的个数可无限。

(3)凑规则: Sε|() 得到ε|(),由 A (S) 得到 (())(()) 是在()的两边再加上一对()得到,((()))是在(())的两边再加上一对()得到,…所以将上述产生式合并为

S(S) |ε。

(4)得到文法 G[S]: S(S) |ε

(5)检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言的句子.

5 构造描述语言L(G[S])={am bn |n>m>0} 的文法。

【解】找出语言的一些典型句子:abbabbb、…、aabbbaabbbb、…,语言的句子的特点是仅含有ab, ab的左边,b的个数大于a的个数,a的个数至少是1

单独生成ck, k>1 可用产生式 Cc |Cc

句子中要求b的个数大于a的个数,所以得到文法:

G[S]: SAb |Sb

AaAb |ab

检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言L(G[S])的句子.

6设有文法G[S]:

SS*S|S+S|(S)|i

该文法是否为二义文法?

【解】该文法是二义文法,因为该文法存在句子i*i+i,该句子有两棵不同的语法树如图2所示.

2句子i*i+i的语法树

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

【解】解题思路

首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以13579中的某个数结尾。如果数字只有一位,则13579就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。分别用3个非终结符来产生句子的第1位、中间部分和最后一位。引入几个非终结符,其中,一个用作产生句子的开头,可以是19之间的数,不包括0,一个用来产生句子的结尾,为奇数,另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。

解答:

G(S)SCDD

   CCBA

   BA0

   A2468D

   D13579

8写一个上下文无关文法CFG,使其语言是能被5整除且不以0开头的无符号整数的集合。(如{5,10,15.})

【解】解答:

能被5整除的数从形式上看,是以0,5结尾的数字串。题目要求的不以0开头,并要注意0不是该语言的句子。所求文法为:

G(S)SMF5

 F50

   MMDN

   DN0

   N123456789

9证明下面的文法是二义的:

S→iSS|iS|i

【解】解题思路:

根据文法的二义性的定义,如果要证明该文法是二义的,必须找到一个句子,使得该句子具有两个不同的最右推导或两个不同的语法树。我们首先分析这个文法,根据我们对程序语言的了解,不难发现,这个文法应该是用来表示if.else.结构的(用“i”代表“if”或语句集,“e”代表“else”)。因此我们就要到if.else结构中去找二义性。我们知道,程序语言一般都规定else部分是和它前面离它最近的没有被匹配的的if语句进行匹配。而上面的这个文法体现不出这种限制,因此我们可以找这样一个句子,在else前面有两个if(如句子iiiei),else和不同的if进行匹配时就会产生不同的语义。

解答:

考虑句子iiiei,存在如下两个最右推导:

S => iSeS => iSei => iiSei => iiiei

S => iS => iiSeS => iiSei => iiiei

10某程序设计语言的表达式由运算符θ1、θ2、θ3、标识符、(、)组成,其中θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,优先级相同的运算符从右往左计算,可以用括号改变运算的顺序,则下述四种文法中哪一个可以描述上述的表达式文法?

E为识别符号,终结符号集={θ1、θ2、θ3、(、)、I},非终结符号集={ETF}

a.ET|Eθ1T|Eθ2T

TF|Tθ3F

F(E)|I

b. ET|Tθ1E|Tθ2E

TF|Fθ3T

F(E)|I

c. ET|Eθ3T

TF|Tθ1F|Tθ2F

F(E)|I

d. ET|Tθ3 E

TF|Fθ1T|Fθ2T

F(E)|I

【解】对于一个包含运算符的语言,运算符的结合顺序、运算符的优先级在文法中反映为递归的方向和推导(或规约)的先后,左递归表明左边的运算先处理,对应的运算符左结合;右递归表明右边的运算先处理,对应的运算符右结合。两个运算符连续出现,后推导出(或先被规约)的,表明其运算先被处理,因此优先级高;反之,先推导出(或后被规约)的,表明其运算后被处理,因此优先级低。

题意要求:θ1和θ2的优先级相同,θ3的优先级低于θ1、θ2的优先级,因此θ3

θ1、θ2先推导出来,即应为图3所示的四种情形。

3可能的文法推导顺序

因此ab不成立。

又因为优先级相同的运算符从右往左计算,应采用右递归,即应为图4所示的情形。

4可能的文法递归结构

c不成立,应为d

本文来源:https://www.2haoxitong.net/k/doc/e532a151f01dc281e53af0e9.html

《编译原理第一章练习和答案.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式