目录
写在前面
文法概要
0型文法(对应图灵机)
1型文法(对应线性界线自动机,自然语言)
2型文法(对应下推自动机,程序设计语言)
3型文法(对应有限自动机)
四类文法的关系与区别
关于正规表达式与上下文无关文法
正规表达式
文法
首先要说明的是:一般的文法至少都是0型文法,也就是说0型文法限制最少。若将0型文法比作基类的话,1、2、3型文法就是不断继承并加以限制得到的子类。
文法表示过程中,常用大写字母表示非终结符VN,而小写字母表示的是终结符VT。
设文法 G[S]=(VN,VT,S,P)
1~3型文法都属于0型文法,2、3型文法不一定属于1型文法(如果存在A→ε的产生式,则不属于1型文法),3型文法属于2型文法。四类文法区别如下:
(1)1型文法中不允许有形如A→ε的产生式存在,而2、3型文法则允许出现。
(2)0、1型文法产生式左部存在含有终结符的符号串或两个以上的非终结符,而2、3型文法的产生式左部只允许是单个非终结符号。
例如:判断该产生式 S-> aSb|ab 对应的文法。
正规表达式所描述的语言结构均可以用上下文无关文法描述,反之则不一定。
1. S={0,1},没有连续两个1的0和1组成的串集合 。
(10|0)*(1|e)
2. S={a,b,c} ,包含至少一个a和一个b的串集合。
c*a(a|c)*b(a|b|c)* | c*b(b|c)*a(a|b|c)*
3. S={0,1},使每对相邻的0都出现在任何一对相邻的1之前的所有01串集合。
(10|0)*|(1|e)(01|1)* |(0|e)
[分析] 这题换个说法来理解就是 “如果出现任意一对相邻的1,那么它后面必然不会出现相邻的0” 。首先,我们将这个01串拆成前后两个部分来考虑,首先给出没有连续两个1的01串的前缀,则这样表示(10|0)*|(1|e),这时需要考虑后面尾部的情况有两种:
4. S={0,1} ,不包含101作为子串的集合。
0*|0*11*|0*11*0|(0*11*00)*(0*11*|0*11*0|e)
按指定类型,给出语言的文法。
1. L={anbn | n≥1}的上下文无关文法
G[S]: S→aT
T→Sb|b
2. L={aibj | j>i≥0}的上下文无关文法
G[S]: S→aSb|Sb|b
3.由相同个数a和b组成句子的无二义文法
官方标配答案:
我们用一个非终结符A代表一个a(即有A→a),用一个非终结符B代表一个b(即有B→b);为了保证a和b的个数相同,则在出现一个a时应相应地出现一个B,出现一个b时则相应出现一个A。假定已推导出bA,如果下一步要推导出连续两个b时,则应有bAbbAA。也即为了保证b和A的个数一致,应有A→bAA;同理有B→aBB。此外,为了保证递归地推出所要求的ab串,应有S→aBS和S→bAS。由此得到无二义文法G[S]为
G[S]: S→aBS|bAS|ε
A→bAA|a
B→aBB|b
自己来看的理解与解题过程:
我们规定S 能推导出所有具有相等个数a和b的符号串
S→ε(最简单的情况,a、b都没有)
S→a B (其中B 中b的个数比a多一个)
S→b A (其中A中a的个数比b多一个)
这里可以看出,引入两个非终极符B和A来分别推出相应的后缀。得到S的产生式:
S→aB | bA | e
接下来,对B采用同样的方法来考虑:
B → b (最简单的情况,a没有)
B →b S
B → a BB
于是可得到B的产生式:
B→bS | aBB | b
同样地,可得到A的产生式:
A→ aS | bAA | a
将三部分放在一起,我们就得到了文法G[S], 如下:
S→aB | bA |e
B→bS | aBB | b
A→aS | bAA | a
[拓展思考]如果将A或B作为开始符号,得到的语言是什么?
4. 字母表Σ={a,b}上的同时只有奇数个a和奇数个b的所有串的集合的正规文法。
为了构造字母表Σ={a,b}上同时只有奇数个a和奇数个b的所有串集合的正规式,我们画出如图所示的DFA,即由开始符S出发,经过奇数个a到达状态A,或经过奇数个b到达状态B;而由状态A出发,经过奇数个b到达状态C(终态);同样,由状态B出发经过奇数个a到达终态C。由图可直接得到正规文法G[S]如下:
G[S]: S→aA|bB
A→aS|bC|b
B→bS|aC|a
C→bA|aB|ε
拓展思考:奇数个a和偶数个b、偶数个a和偶数个b、偶数个a和奇数个b又怎么表示呢?
更多文法构造例子:http://download.csdn.net/download/jave_f/10016955
【附:一文一图】