编译原理-文法定义

一. 文法公式

文法定义公式如下:

G = (VT , VN , P , S)
  1. VT : 终结符集合

终结符就是不可以再推导的字符。
也就是说对于一个字符 a ,它属于终结符集合 VT(a∈VT) , a 不可以再推导的字符,即不能用其他字符表示 a。表现形式就是 a 不能单独出现在产生式左边。

  1. VN : 非终结符集合

非终结符即可以继续推导的字符。

  1. P : 产生式集合

产生式就是推导公式,表示这个文法的定义规则。
产生式形式 α→β ,其中 αβ 都是属于文法符合串 (VN∪VT)* 。α 称为产生式的左部或者头部;β 称为产生式的右部或者体。
文法符合串,即终结符集合和非终结符集合任一排列组合成的字符串。例如 aAbbB , 其中 (a,b∈VT , A,B∈VN) 就是一个文法符合串。

  1. S : 开始符号

即文法从这个符号 S 利用产生集合 P 开始推导。S 是一个非终结符,即 S∈VN。
一般情况下,第一个产生式左部符号就是开始符号。

二. 文法分类

Chomsky 文法分类将文法分为四种,0型文法(PSG)、1型文法(CSG)、2型文法(CFG)和3型文法(RG)。

其实不同的文法就是对产生式进行逐层限制形成的。

2.1 0型文法(PSG)

又被称为无限制文法(Unrestricted Grammar), 或者短语结构文法(Phrase Structure Grammar)
定义: 对于产生式 α→βα 至少包含一个非终结符。

即 α,β∈(VN∪VT)* , αβ 都是文法符合串,并且 α 文法符合串中必须包含一个非终结符。
例如: aA→0bB; A0→11bB; 其中 (a,0,b∈VT),(A,B∈VN)。

为什么要叫无限制文法,明明它要求产生式的左部必须包含一个非终结符。

因为我们知道终结符是不能再推导出其他字符的,所以产生式的左部不能全是终结符组成的文法符合串(VT*),这个是不允许的,所以产生式的左部必须包含一个非终结符。

2.2 1型文法(CSG)

又被称为上下文有关文法(Context-Sensitive Grammar)
定义:对于产生式 α→β , |α| <= |β|, 仅仅 S→ε 除外

|α| 表示 α 这个文法符合串中字符个数。例如 aAb 这个字符个数就是3个。

也就是说1型文法要求产生式右部文法符合串β 的字符个数要不小于产生式左部文法符合串α 的字符个数;但是空产生式(S→ε) 除外。

ε 表示空串,即文法符号串中没有任何字符元素(|ε|=0)

为什么叫做上下文有关文法?

因为对于任何一个非终结符 A (即 A∈VN),想要将它替换成其他文法符号串,必须要有对应形式的产生式。

一般情况下,这种产生式的形式为 α1Aα2→α1βα2

其中 α1,α2,β∈(VN∪VT)*, β≠ε,A∈VN。
所以对于非终结符 A, 出现在 α1α2 上下文中,就可以替换成文法符号串β

例如: 对于这个产生式 1A2→112342 ,可以将非终结符 A 替换成文法符号串 1234

2.3 2型文法(CFG)

又被称为上下文无关文法(Context-Free Grammar)
定义:对任一产生式 α→β,都有 α∈VN,β∈(VN∪VT)*

对产生式左部进行了限制,α 就是非终结符集合 VN 中一个字符元素。
当然一个非终结符也是一个特殊的文法符号串,串中只有一个字符,且是一个非终结符。
β∈(VN∪VT)*, β 表示一个文法符号串,其中空串 ε 也是一个特殊文法符号串。
所以对于2型文法也有空产生式 (S→ε)

为什么叫上下文无关文法?

因为对于任何一个非终结符 A (即 A∈VN),可以直接根据产生式替换成一个文法符号串,而不需要特殊的上下文环境。

2.4 3型文法(RG)

又被称为正则文法(Regular Grammar,RG),分为右线性(Right Linear)文法和左线性(Left Linear)文法。

定义: 对任一产生式 α→β,都有 α∈VN,β最多两个字符元素,如果有二个字符必须是(终结符+非终结符)的格式,如果是一个字符,那么必须是终结符。

产生的左部只能是一个非终结符元素。
产生的右部最多两个字符元素 (即 bB,Bb 其中 b∈VT, B∈VN),或者只有一个元素,且必须是终结符(即b, b∈VT)。

根据产生式右部非终结符位置不同,分为右线性文法和左线性文法。

  1. 右线性文法: A→bB 或者 A→b
  2. 左线性文法: A→Bb 或者 A→b

注: 正则文法产生式集合中每个产生式有相同的线性,即所有产生式要么都是右线性文法,要么都是左线性文法。

2.5 小结

可以看出,不同文法就是对产生式进行逐层的限制,所以各个文法是包含关系,即0型文法包含1型文法;1型文法又包含2型文法;2型文法最后包含3型文法。

你可能感兴趣的:(编译原理-文法定义)