编译原理第一章练习和答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1设有文法G[S]:
S →a|(T )| T →T,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)的分析树
S
( T ) T , S S T ,
S 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]:
Z →0U|1V U →1Z|1 V →0Z|0
(1) 请写出此文法描述的只含有4个符号的全部句子。 (2) G [Z]产生的语言是什么? (3) 该文法在Chomsky 文法分类中属于几型文法? 【解】(1)0101,0110,1010, 1001
(2)分析G[Z]所推导出的句子的特点:由Z 开始的推导不外乎图1所示的四种情形。
图 1文法G[Z]可能的几种推导
Z
1
U Z U
Z
1
Z
1
Z
1
V
由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或
01。所以G[Z]产生的语言L(G[Z])={x|x∈(10|01)+ }
(3)该文法属于3型文法。
例3 已知文法G=({A,B,C},{a,b,c},P,A), P由以下产生式组成:
A→abc
A→aBbc
Bb→bB
Bc→Cbcc
bC→Cb
aC→aaB
aC→aa
此文法所表示的语言是什么?
【解】
分析文法的规则:
每使用一次Bc→Cbcc,b、c的个数各增加一个;
每使用一次aC→aaB或aC→aa, a的个数就增加一个;
产生式Bb→bB、 bC→Cb起连接转换作用。
由于A是开始符号,由产生式A→abc推导得到终结符号串abc;由产生式A→aBbc推导得到B后,每当使用产生式Bb→bB、Bc→Cbcc、bC→Cb、aC→aaB就会递归调用B一次,所产生的a、b、c的个数分别增加一个,因此推导所得的终结符号串为abc、aabbcc、aaabbbccc、…所以文法描述的语言为{ a n b n c n|n>0}.
例4 构造描述语言L(G[S])={(n)n|n≥0} 的文法。
【解】(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])={a m b n |n>m>0} 的文法。
【解】找出语言的一些典型句子:abb、abbb、…、aabbb、aabbbb、…,语言的句子的特点是仅含有a、b, a在b的左边,b的个数大于a的个数,a的个数至少是1。
单独生成c k, k>1 可用产生式 C→c |Cc
句子中要求b的个数大于a的个数,所以得到文法:
G[S]: S →Ab |Sb
A →aAb |ab
检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言L(G[S])的句子.
例6设有文法G[S]:
S →S*S|S+S|(S)|i
该文法是否为二义文法?
【解】该文法是二义文法,因为该文法存在句子i*i+i,该句子有两棵不同的语法树如图2所示.。
S
S S S S (1)
+
S
S + S S S (2)
*
i
i
i
图2句子i*i+i 的语法树
例7写一个文法,使其语言是奇数集,且每个奇数不以0开头。 【解】解题思路
首先分析题意,本题是希望构造一个文法,由它产生的句子是奇数,并且不以0开头,也就是说它的每个句子都是以1、3、5、7、9中的某个数结尾。如果数字只有一位,则1、3、5、7、9就满足要求,如果有多位,则要求第1位不能是0,而中间有多少位,每位是什么数字(必须是数字)则没什么要求,因此,我们可以把这个文法分3部分来完成。分别用3个非终结符来产生句子的第1位、中间部分和最后一位。引入几个非终结符,其中,一个用作产生句子的开头,可以是1-9之间的数,不包括0,一个用来产生句子的结尾,为奇数,另一个则用来产生以非0整数开头后面跟任意多个数字的数字串,进行分解之后,这个文法就很好写了。 解答:
G(S):S →CD |D C →CB |A B →A |0
A →2|4|6|8|D D →1|3|5|7|9
例8写一个上下文无关文法CFG ,使其语言是能被5整除且不以0开头的无符号整数的集合。(如{5,10,15,….}) 【解】解答:
能被5整除的数从形式上看,是以0,5结尾的数字串。题目要求的不以0开头,并要注意0不是该语言的句子。所求文法为:
G(S):S →MF |5 F →5|0 M →MD |N D →N |0