1、文法G[Z]: Z->U0|V1 U->Z1|1 V->Z0|0 对应的正规式是:()
计算思路: Z->U0 => Z->Z10 ;Z->V1 和V->Z0 => Z->Z01, 得出正规式为 (10|01)+
2、语言L={Am Bn| m≥0,n≥2}的正规表达式是:()
计算思路:n≥2,因此正规表达式应该是 A*BB B*
3、假设某程序语言的文法如下:
S→a|b|(T)
T→TdS|S
其中,VT={a,b,d,(,));VN={S,T},S是开始符号。考察该文法,句型(Sd(T)db)是S的一个()。
其中()是最左素短语,()是该句型的直接短语。()是短语
A:①最左推导 ②最右推导 ③规范推导 ④推导?
B:①S ②b ③(T) ④Sd(T)?
C:①S ②b ③(T) ④Sd(T)?
D:①S ②S,(T),b?
③S,(T),TdS,b ④(Sd(T)db)?
E:①(Sd(T)db) ②d(T) ③Td ④Sd(T)d?
计算思路:解答本题要搞清楚基本概念,下面具体分析各个问题。
先来看问题A。最左(右)推导:任何一步推导过程σ→β(其中σ、β是句型)都是对σ中的最左(最右)非终结符进行替换,这种推导为最左(最右)推导。在形式语言中,最右推导常被称为规范推导。
题中的句型(Sd(T)db)的第一步肯定是由S→(T)→(TdS)得出的。按照最左推导的规则(Tds)→(TdSdS)→(SdSdS),最终不可能推出原来的句型。
按照最右推导的规则(Tds)→(Tdb)→(Td(T)db),最终不可能推出原先的句型。
最后可以看出句型(Sd(T)db)是由一般推导推出的,步骤如下:
S→(T)→(Tds)→(Tdb)→(Td(T)db)→(Sd(T)db)
所以正确答案是④。
再来看问题B~E。来文法,S是文法的开始符号,αβδ是文法G的一个句型。如果有S→αAδ,且A→β,则称β是句型αβδ相对于非终符A的短语。特别是如有Aβ,则称β是句型αβδ相对于规则A→β的直接短语。一个句型的最左直接短语称为该句型的句柄。
本文法推导树如下:
S
/ |
( T )
/ |
T d S
/ | |
T d S b
| /|
S ( T )
所以,S是句型相对于规则T→S的直接短语,也是最左直接短语(句柄)。(T)是句型相对于规则S→(T)的直接短语,对于问题B,选择①是正确的。
素短语是一个短语,它至少包含一个终结符,并除自身外不包含其他的素短语。所以,问题C的答案③正确。
d是句型相对于规则S→d的直接短语,则问题D的答案②正确。
由推导树可知,无论如何,无法由S推导出d(T)、Td或Sd(T)d,所以问题E的答案①正确。
原文请参考http://blog.csdn.net/shuijinglianyi/article/details/2096222 和http://blog.itpub.net/9460545/viewspace-1001987/