编译原理 | 关于四种文法的理解学习及如何根据语言描述给出正则式or相应文法

目录

写在前面

文法概要

0型文法(对应图灵机)

1型文法(对应线性界线自动机,自然语言)

2型文法(对应下推自动机,程序设计语言)

3型文法(对应有限自动机)

四类文法的关系与区别

关于正规表达式与上下文无关文法

正规表达式

文法


写在前面

首先要说明的是:一般的文法至少都是0型文法,也就是说0型文法限制最少。若将0型文法比作基类的话,1、2、3型文法就是不断继承并加以限制得到的子类。
文法表示过程中,常用大写字母表示非终结符VN,而小写字母表示的是终结符VT

 


文法概要

设文法 G[S]=(VN,VT,S,P)

 

0型文法(对应图灵机)

  • 如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G[S]是一个0型文法。
  • 0型文法也称短语文法,记为PSG。
  • 一个非常重要的理论结果是:0型文法的能力相当于图灵机。或者说,任何0型文语言都是递归可枚举的,反之,递归可枚举集必定是一个0型语言。

 

1型文法(对应线性界线自动机,自然语言)

  • 它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。
  • 注意:虽然要求|β|>=|α|,但有一特例:α→ε也满足1型文法。
  • 1型文法也叫上下文有关文法,记为CSG。
  • 此文法对应于线性有界自动机。

 

2型文法(对应下推自动机,程序设计语言)

  • 2型文法是在1型文法的基础上,再满足:每一个α→β都有α是非终结符。
  •  2型文法也叫上下文无关文法,记为CFG。
  • 此文法对应于下推自动机。

 

3型文法(对应有限自动机)

  • 它是在2型文法的基础上满足:A→α|αB(右线性)或A→α|Bα(左线性)。
  • 3型文法也叫正规文法,记为RG。
  • 此文法对应于有限状态自动机。

 


四类文法的关系与区别

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),这时需要考虑后面尾部的情况有两种:

  •  一种是没有一对相邻的1,那么之前表示足以。
  • 另一种是存在若干对相邻的1,那么则用(01|1)* |(0|e) 来表示。

 

4. S={0,1} ,不包含101作为子串的集合。

0*|0*11*|0*11*0|(0*11*00)*(0*11*|0*11*0|e)

编译原理 | 关于四种文法的理解学习及如何根据语言描述给出正则式or相应文法_第1张图片

 

文法

按指定类型,给出语言的文法。

1. L={anbn | n≥1}的上下文无关文法

G[S]:   SaT

TSb|b

 

2. L={aibj | j>i≥0}的上下文无关文法

G[S]:   SaSb|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]:   SaBS|bAS|ε

AbAA|a

BaBB|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], 如下:

SaB | bA |e

BbS | aBB | b

AaS | bAA | a

[拓展思考]如果将AB作为开始符号,得到的语言是什么?

 

4. 字母表Σ={a,b}上的同时只有奇数个a和奇数个b的所有串的集合的正规文法。

为了构造字母表Σ={a,b}上同时只有奇数个a和奇数个b的所有串集合的正规式,我们画出如图所示的DFA,即由开始符S出发,经过奇数个a到达状态A,或经过奇数个b到达状态B;而由状态A出发,经过奇数个b到达状态C(终态);同样,由状态B出发经过奇数个a到达终态C。由图可直接得到正规文法G[S]如下: 

编译原理 | 关于四种文法的理解学习及如何根据语言描述给出正则式or相应文法_第2张图片

G[S]:   SaA|bB 

AaS|bC|b 

BbS|aC|a      

CbA|aB|ε

拓展思考:奇数个a和偶数个b、偶数个a和偶数个b、偶数个a和奇数个b又怎么表示呢?

更多文法构造例子:http://download.csdn.net/download/jave_f/10016955

 

 

 

【附:一文一图】

编译原理 | 关于四种文法的理解学习及如何根据语言描述给出正则式or相应文法_第3张图片

你可能感兴趣的:(大学课程)