正则表达式的真正威力(2)
上下文有关文法 接下来再看乔姆斯基谱系上一层:上下文有关语言。 上下文有关语言中的产生式都具有以下形式: α A β → α γ β 这种混合字符初看很复杂,其实很简单。核心依然具有形式 A → γ ,这点跟上下文相关文法一致。不同的是两边多出了 α 和 β 。这两者就构成了上下文(文法的名称由此得来)。所以 A 可以被 γ 替代的条件是其左右也有 α 和 β 。 为了清晰的说明这点,试着解析下面的规则: a b A -> a b c a B c -> a Q H c H B -> H C 翻译出来就是: 只有左边有`a b`时,`A`才可以用`c`替换 只有左边是`a`右边是`c`时,`B`才可以用`Q H`替换 只有走边是`H`时,`B`才可以用`C`替换 上下文相关文法在“一般”编程中是很少遇到的。在自然语言处理中比较重要(因为自然语言显然不是上下文无关的。单词在不同的上下文中意义不同)。然而即便在自然语言处理中,人们也经常使用“温和的上下文相关语言”,因为可以有效建模语言又可以快速解析。 要理解上下文相关文法有多么强大,我们先看一下另一种文法类型,它和上下文相关文法有基本一样的表达能力:非收缩文法。 非收缩文法每一个产生式规则的形式都是 α -> β ,其中 α 和 β 都是任意的符号串,唯一的限制是:右边的符号长度不能小于左边的符号。