上下文无关文法(Context-Free Grammars)

565 阅读3分钟

1.引言

语言识别器(language recognizer):一种接受有效字符串的设备。
例如有穷自动机就是一种形式化的语言识别器。

语言生成器(language generator):一种生成有效字符串的设备。
正则表达式就可以看作一种语言生成器。

考虑正则表达式a(ab)ba(a^* \cup b^*)b,可以解释为如下语言描述的过程:

首先输出一个a,然后输出若干个a或者输出若干个b,最后输出一个b

可以注意到此语言由一个前导a,中间部分(ab)(a^* \cup b^*),尾巴b三部分组成。

于是令新的符号SS,解释为“语言中的一个字符串”,而MM是一个代表“中间部分”的符号。 于是可以写作

SaMbS \rightarrow aMb

这样的表达式称为一个规则。我们可以继续添加规则来描述MM

MA    MBM \rightarrow A \; 和 \; M \rightarrow B

这里的AABB分别是表示“包含若干个a的字符串”和“包含若干个b的字符串”的新符号。 进而,“包含若干个a的字符串”可以是空串,于是

AeA \rightarrow e

也可以是一个前导a和若干a的字符串组成

AaAA \rightarrow aA

对于BB同理。

于是描述正则表达式的语言也可以用另一种方式来定义:

从由一个符号SS组成的字符串开始。
在当前字符串中找一个出现在上面的一条规则\rightarrow左侧的符号,将它替换为\rightarrow右侧的字符串。
重复此过程直到无法找到这样的符号停止。

上下文无关文法就是像上述定义进行运算的语言生成器。

2.上下文无关文法的定义

在上下文无关文法中,出现在\rightarrow右侧的符号称为终结符,当生成了一个仅由终结符组成的字符串意味着过程的结束。


定义3.1.1 上下文无关文法 GG 是一个四元组(V,Σ,R,S)(V,\Sigma,R,S)
VV是一个字母表
Σ\Sigma终结符集合,是VV的子集
RR规则集合,是(VΣ)×V(V-\Sigma) \times V^*的有穷子集
SVΣS \in V - \Sigma起始符


VΣV-\Sigma的成员称为非终结符
(A,u)R(A,u) \in R时记作AGuA \rightarrow_G u
对任意字符串u,vVu,v \in V^*,记uGvu \Rightarrow_G v当且仅当存在字符串x,yVx,y \in V^*AVΣA \in V-\Sigma使得u=xAy,v=xvyu = xAy,v=xv'yAGvA \rightarrow_G v'
关系G\Rightarrow^*_GG\Rightarrow_G自反传递闭包
于是GG生成的语言为{wΣ:SGw}\{w \in \Sigma^*:S \Rightarrow^*_G w\}
如果L=L(G)L = L(G),且GG是一个上下文无关文法,则称LL是一个上下文无关语言

3.例子


例3.1.1 考虑上下文无关文法G=(V,Σ,R,S)G = (V,\Sigma,R,S),其中V={S,a,b},Σ={a,b}V = \{S,a,b\},\Sigma = \{a,b\},而且RR包含规则SaSbS \rightarrow aSbSeS \rightarrow e,于是可以有如下推导

SaSbaaSbbaabbS \Rightarrow aSb \Rightarrow aaSbb \Rightarrow aabb

进一步地,可以看出L(G)={anbn:n0}L(G) = \{ a^nb^n:n \ge 0 \},因此,某些上下文无关语言不是正则的
然而,所有的正则语言是上下文无关的(后续可以证明)。



例3.1.2 设计一个表示部分英文的文法G=(W,Σ,R,S)G = (W,\Sigma,R,S)

W={S,A,N,V,P}ΣΣ={Jim,big,green,cheese,ate}R={PN,PAP,SPVP,Abig,Agreen,Ncheese,NJim,Vate}\begin{aligned} W = \{ &S,A,N,V,P \} \cup \Sigma \\ \Sigma = \{ &Jim,big,green,cheese,ate \} \\ R = \{ &P \rightarrow N,\\ &P \rightarrow AP,\\ &S \rightarrow PVP,\\ &A \rightarrow big,\\ &A \rightarrow green,\\ &N \rightarrow cheese,\\ &N \rightarrow Jim,\\ &V \rightarrow ate\} \end{aligned}

其中SS表示句子,AA表示形容词,NN代表名词,VV表示动词,PP表示短语。
下面是一些L(G)L(G)中的字符串例子

Jim ate cheese
big Jim ate green cheese
big cheese ate Jim

然而下面的一些奇怪的句子也属于L(G)L(G)

big cheese ate green green big green big cheese
green Jim ate green big Jim