2.3.3 语言的形式定义
1. 直接推导
令 G 是一文法,我们从 xAy 直接推出xαy ,即 xAy⇒xαy ,仅A → α 是 G 的一个规则且x , y ∈ ( V N ∪ V T )* 。也就是说,从符号串 xAy 直接推导出xαy仅使用一次规则。
例如,设有文法 G [ S ](符号 G [ S ]表示 S 为文法 G 的开始符号):
G [ S ] = ({ S },{ 0 , 1 }, P , S )
其中,P 为S →01|0 S 1
有如下直接推导:
S ⇒01 使用规则 S →01 , 此时 x = ε , y = ε
S ⇒0 S 1使用规则 S →0 S 1 , 此时 x = ε ,y = ε
0 S 1⇒0011 使用规则 S →01 , 此时 x =0 , y =1
00 S 11⇒000 S 111 使用规则 S →0 S 1 , 此时 x =00 , y =11
000 S 111⇒00001111 使用规则 S →01 , 此时 x =000 ,y =111
注意推导和规则的区别:一是形式上的区别,推导用“ ⇒ ”表示,规则用“ → ”表示;二是对文法 G 中任何规则 A → α ,有 A ⇒ α ,即推导的依据是规则。
2. 推导
**如果存在一个直接推导序列:
α 0 ⇒ α 1 ⇒ α 2 ⇒ … ⇒ α n
则称这个序列是一个从 α0 至 α n 的长度为 n 的推导,记为 α 0 ⇒+ αn
。即α 0 ⇒+ αn
表示从 α 0 出发,经一步或若干步或使用若干次规则可推导出 αn。
例如,设有文法 G [ E ]:
G [ E ] = ({ E , T , F },{ i , + , * ,(,)}, P , E )
其中,P 为
E → E + T | T
T → T * F | F
F → ( E ) | i
对 i + i * i 有如下直接推导序列
E ⇒ E + T ⇒ T + T ⇒ F + T ⇒ i + T
⇒ i + T * F ⇒ i + F * F ⇒ i + i * F ⇒ i + i * i
我们可记为 E ⇒+ i +i * i
3. 广义推导
α 0 ⇒* α
n 表示从 α 0 出发,经 0 步或若干步,可推导出 α n 。也就是说, α 0 ⇒* αn 意味着, α 0 = α n ,或者 α0 ⇒+ αn 。
对上例,有
E ⇒* E
E ⇒* i +i * i
显然,直接推导的长度为 1 ,推导的长度大于等于 1 ,而广义推导的长度大于等于 0 。
4. 句型和句子
设有文法 G [ S ]( S 是文法 G 的开始符号),如果 S ⇒ x* ,
x ∈ ( V N ∪ V T )* ,则称符号串 x 为文法 G [ S ]的句型。 S ⇒ x ,x ∈ V T* * ,则称 x 是文法 G [ S ]的句子。
【例 2.5 】
设有文法 G [ S ]:
S →01|0 S 1
有
S ⇒* 01
S ⇒* 0S1
S ⇒* 00S 11
S ⇒* 000111
显然,符号串 01 ,0 S 1 , 00 S 11 和 000111 都是文法 G [ S ]的句型,而 01 和 000111 又是文法G [ S ]的句子。
【例 2.6 】设有文法 G [ E ]:E → E + E | E * E | ( E ) | i
试证明符号串(i * i + i )是文法 G [ E ]的一个句子。
分析 只要证明符号串(i * i + i )对文法 G 存在一个推导,就可证明符号串( i * i + i )是文法 G [ E ]的一个句子。因为有
E ⇒ ( E ) ⇒ ( E + E ) ⇒ ( E * E + E ) ⇒ ( i * E + E ) ⇒ ( i * i + E ) ⇒ ( i * i + i )
即有 E ⇒*(i * i + i ),所以符号串( i * i + i )是文法 G [ E ]的一个句子。
5. 语言
文法 G [ S ]产生的所有句子的集合称为文法 G 所定义的语言,记为 L ( G [ S ]):L ( G [ S ]) = { x | S ⇒+ x且 x ∈ V T * }
注意,这里用 S ⇒+ x ,而不是用 S ⇒ * x 。因为 S 是文法的开始符号,S ∈ V N ,若用 S ⇒* x ,那么有可能有 S = x ,这与 x ∈ V T * 相矛盾。此时的 x 不可能是句子。此处,如果用 S ⇒
- x,由于后面的条件是且的关系,也会自然在集合中去除掉开始符号,所以得到的最终集合与这里定义的 L 相同。
由语言定义可知:
(1 )当文法给定,语言也就确定。
(2 ) L ( G )是 V T * 的子集,即属于 V T * 的符号串 x 不一定属于 L ( G )。
【例 2.7 】
设有文法 G [ S ]:
S →01|0 S 1
求该文法所描述的语言。
分析 问题归结为由识别符号 S 出发,将推出一些什么样的句子,也就是说, L ( G [ S ])是由一些什么样的符号串所组成的集合,找出其中的规律,用式子或自然语言描述出来。
此处应用第二个规则 n -1 次,然后再应用第一个规则 1 次,有
S ⇒0 S 1⇒00 S 11⇒000 S 111 … ⇒0(n -1)S 1(n -1) ⇒0n1n
即 S ⇒+ 0n1n ,可见,此文法定义的语言为
L ( G [ S ]) = { 0n1n |n ≥1 }
【例 2.8 】
设有文法 G [ S ]:
S →0 S |1 S | ε
求该文法所定义的语言。
由该文法所确定的语言为
L ( G [ S ]) = { ε , 0 , 1 , 00 , 01 , 10 , 11 ,…} = { x | x ∈ { 0 , 1 }* }
【例 2.9 】
设有文法
G [ A ]:A →yB, B → xB | x
求该文法所定义的语言。
分析 从文法开始符号 A 出发可推导出以 y 开头后面跟一个或多个 x 结尾的符号串,所以该文法定义的语言为 L ( G [ A ]) = {yxn |n ≥1 }
。
由此可见,从已知文法确定语言的中心思想是:从文法的开始符号出发,反复连续地使用规则,对非终结符施行替换和展开,找出句子的规律,用式子或自然语言描述出来。
形式语言理论可以证明如下两点:
(1 )给定一个文法,就能从结构上唯一地确定其语言,即 G → L ( G )。
(2 )给定一种语言,能确定其文法,但这种文法不是唯一的,即 L→ G 1 或 G 2 或 … 或 G n 。
对此我们不予证明,但已通过前面的举例说明了这两点。