在计算机科学中,上下文无关文法(CFG)是一种描述形式语言的形式文法。CFG由三个部分组成:终结符集合、非终结符集合和产生式集合。通过给出一组产生式,CFG描述了语言中符号的替代规则。这种规则本质上是一种生成算法,可用于创建可以被CFG所描述的字符串。
下面我们来看一个例子:
考虑以下语言L = {0^n1^n | n>=0}。这个语言描述了所有由n个0后跟n个1组成的字符串,其中n可以为任意非负整数。例如,L中的一些有效字符串包括“01”、“0011”、“000111”等等。
那么我们来构建一个上下文无关文法G = (V, T, S, P),用于描述语言L,即:
- V:非终结符集合,包括一个符号S。
- T:终结符集合,包括0和1。
- S:起始符号,S∈V。
- P:产生式集合,包括:
S → 0S1
S → ε
这个文法可以理解为:
- 起始符号S可以被替换为一个以0开始、1结束的S。
- 起始符号S也可以直接替换为空串。
接下来我们来分析这个上下文无关文法。
1. 能够生成语言L
首先,我们需要证明这个上下文无关文法可以生成语言L。由于G定义了一堆产生式,我们可以通过使用这些产生式来推导每一个有效字符串,证明每一个有效字符串都属于语言L。
例如,“01”可以推导如下:
S → 0S1 → 01
“0011”可以推导如下:
S → 0S1 → 00S11 → 0011
接下来,我们可以利用归纳法证明任意字符串都属于语言L。假设一个字符串s属于语言L,长度为n。我们可以将s分成两半,其中前一半由n/2个0组成,后一半由n/2个1组成。
那么,s可以被推导为S → 0^kS1^k,其中k=n/2。根据归纳假设,S可以被推导为一个由n/2个0和1组成的字符串,因此s也属于语言L。
因此,这个上下文无关文法G可以生成语言L。
2. 最左推导和最右推导
在使用产生式进行推导时,我们可以选择最左推导或最右推导。选择哪种推导可以影响到解析树的形状。解析树是一种可视化CFG推导的方式,它显示了每个符号的推导路径。
对于这个上下文无关文法G,最左推导将在左侧添加新符号,而最右推导将在右侧添加新符号。例如,对于“0011”,最左推导如下:
S → 0S1 → 00S11 → 0011
而最右推导如下:
S → 0S1 → 0S11 → 00S111 → 0011
这里需要注意的是,最左推导和最右推导都是正确的,它们只是不同的方式来展示语言的生成和解析。
3. CNF(乔姆斯基范式)
从CFG到CNF(乔姆斯基范式)的转换是一个有用的操作。CNF是一种形式文法,其中每个产生式都只有两个非终结符或一个终结符。对上下文无关文法进行CNF转换后,可以很容易地构建出语法树,此外,一些算法也要求使用CNF。
这个上下文无关文法G已经是CNF形式,因为它只有两个产生式,每个产生式都具有一个终结符。
扫码领取最新备考资料