1.引言
语言识别器(language recognizer):一种接受有效字符串的设备。
例如有穷自动机就是一种形式化的语言识别器。
语言生成器(language generator):一种生成有效字符串的设备。
正则表达式就可以看作一种语言生成器。
考虑正则表达式a(a∗∪b∗)b,可以解释为如下语言描述的过程:
首先输出一个a,然后输出若干个a或者输出若干个b,最后输出一个b
可以注意到此语言由一个前导a,中间部分(a∗∪b∗),尾巴b三部分组成。
于是令新的符号S,解释为“语言中的一个字符串”,而M是一个代表“中间部分”的符号。
于是可以写作
S→aMb
这样的表达式称为一个规则。我们可以继续添加规则来描述M:
M→A和M→B
这里的A和B分别是表示“包含若干个a的字符串”和“包含若干个b的字符串”的新符号。
进而,“包含若干个a的字符串”可以是空串,于是
也可以是一个前导a和若干a的字符串组成
对于B同理。
于是描述正则表达式的语言也可以用另一种方式来定义:
从由一个符号S组成的字符串开始。
在当前字符串中找一个出现在上面的一条规则→左侧的符号,将它替换为→右侧的字符串。
重复此过程直到无法找到这样的符号停止。
上下文无关文法就是像上述定义进行运算的语言生成器。
2.上下文无关文法的定义
在上下文无关文法中,出现在→右侧的符号称为终结符,当生成了一个仅由终结符组成的字符串意味着过程的结束。
定义3.1.1 上下文无关文法 G 是一个四元组(V,Σ,R,S)
V是一个字母表
Σ是终结符集合,是V的子集
R是规则集合,是(V−Σ)×V∗的有穷子集
S∈V−Σ是起始符
V−Σ的成员称为非终结符。
当(A,u)∈R时记作A→Gu。
对任意字符串u,v∈V∗,记u⇒Gv当且仅当存在字符串x,y∈V∗和A∈V−Σ使得u=xAy,v=xv′y和A→Gv′。
关系⇒G∗是⇒G的自反传递闭包。
于是G生成的语言为{w∈Σ∗:S⇒G∗w}。
如果L=L(G),且G是一个上下文无关文法,则称L是一个上下文无关语言。
3.例子
例3.1.1 考虑上下文无关文法G=(V,Σ,R,S),其中V={S,a,b},Σ={a,b},而且R包含规则S→aSb和S→e,于是可以有如下推导
S⇒aSb⇒aaSbb⇒aabb
进一步地,可以看出L(G)={anbn:n≥0},因此,某些上下文无关语言不是正则的。
然而,所有的正则语言是上下文无关的(后续可以证明)。
例3.1.2 设计一个表示部分英文的文法G=(W,Σ,R,S),
W={Σ={R={S,A,N,V,P}∪ΣJim,big,green,cheese,ate}P→N,P→AP,S→PVP,A→big,A→green,N→cheese,N→Jim,V→ate}
其中S表示句子,A表示形容词,N代表名词,V表示动词,P表示短语。
下面是一些L(G)中的字符串例子
Jim ate cheese
big Jim ate green cheese
big cheese ate Jim
然而下面的一些奇怪的句子也属于L(G)
big cheese ate green green big green big cheese
green Jim ate green big Jim