Skip to content

模型Model

上下文无关文法

Context-free grammar · CFG

每条产生式左侧是单个非终结符的生成系统。

形式陈述 ​

上下文无关文法(CFG)是形式文法在产生式左侧上的一种限制。它仍写作四元组

G=(V,Σ,R,S),

其中 V 是非终结符集合,Σ 是终结符字母表,R 是产生式集合,S 是开始符号。相对于通用文法,额外要求每条规则都形如 A→α,其中 A∈V、α∈(V∪Σ)∗。因此一步推导总是在任意上下文中替换一个非终结符:若 A→α,则 uAv⇒uαv。

文法生成的语言为

L(G)={w∈Σ∗:S⇒∗w}.

“上下文无关”指规则能否应用只取决于被替换的单个非终结符 A,不取决于它左右的符号。

这里 V 与 Σ 是互不相交的有限集合,R 有限,S∈V;右侧可以为空,也可以包含多个非终结符。⇒∗ 允许零步或有限多步,但只有最后全由终结符组成的字才计入 L(G)。例如中间串 aaSbb 是合法句型,却不是生成语言中的一个字。

直觉

CFG 用递归替换描述嵌套结构。非终结符像尚未展开的结构类别,产生式给出一种合法展开方式;同一非终结符可在任何上下文中按同样规则展开。它比有限自动机多出的力量来自隐式递归深度,可以生成任意层括号或成对计数。文法是生成语言的规格,不自动规定唯一解析、求值顺序或高效解析算法,这些是额外性质。

每个 S 都按同一规则独立展开,叶序列去掉空字后得到 aabb。
例子与边界

文法

S→aSb∣ε

生成 {anbn:n≥0}。每用一次 S→aSb,就给尚未展开的 S 左右各加一个符号:S⇒aSb⇒aaSbb;最后用 S→ε 移去中间的待办符号,得到 aabb。图中的叶子从左到右给出同一结果。任意有限次展开后,中间句型总是 akSbk;只有使用空规则才能结束,因此不会生成 abab 或 aab。反过来,要生成 anbn,展开恰好 n 次再结束即可。这两个方向共同说明语言“恰好”是什么。

平衡括号可由 S→SS∣(S)∣ε 描述:SS 把两个平衡片段并排放置,(S) 在一个平衡片段外包一层。比如 S⇒SS⇒(S)S⇒()S⇒()(S)⇒()() 展示的是连接,S⇒(S)⇒((S))⇒(()) 展示的是嵌套。

边界语言 {anbncn:n≥0} 需要同步三个无界计数,不是上下文无关语言。另一个边界是文法本身可能歧义:同一字有多个推导树并不改变成员集合,却会给编程语言解析带来不同结构。

歧义不能仅凭“有两种改写顺序”判断。对 S→AB,A→a,B→b,先改写 A 或先改写 B 都得到 ab,但只有一棵树。相反,E→E+E∣E∗E∣a 对 a+a*a 可把根分成加法或乘法,对应 a+(a∗a) 与 (a+a)∗a 两种结构。固定最左推导仍会留下这两种选择,因此它们才见证歧义。

推论与应用

CFG 与下推自动机由CFG–PDA 等价定理刻画同一语言类。允许产生式读取上下文并保持非收缩,会得到更强的上下文有关语言;两者在Chomsky 层级中的位置与严格分离应由层级页承担,而不是混入 CFG 定义。语法树记录具体推导结构,Chomsky 范式与 CYK 算法提供标准化和判定方法。

编程语言语法、配置文件、自然语言片段和递归数据格式常用 CFG 描述;解析器再把终结符流转换为 AST,并处理优先级与歧义。

从栈机器反向构造文法给出另一种得到规则的方式:状态与栈符号组合成变量,运行的首次弹栈边界决定子推导的分割。完整八变量例子也展示了不生成变量的删除;有递归产生式并不保证存在有限的终结推导。

PEG的有序选择不等于 CFG 的备选产生式。CFG 的 S→aC∣abC、C→c 同时生成 ac 与 abc,规则排列次序无关;把同样外观写成 PEG 的 ("a"/"ab")"c",在 abc 上却会先让短分支成功,再因后面的 c 失败而拒绝。比较的是生成式的存在选择与识别式的优先承诺,不能未经证明把两套文法互换。

参考资料
  • John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, 3rd ed., Pearson, 2006,Chs. 5–7。
  • Michael Sipser, Introduction to the Theory of Computation, 3rd ed., Cengage, 2013,§2.1。
  • Old Dominion University CS390, Pushdown Automata, Fall 2024 course notes,§2.1,最左推导与栈模拟。
关系图谱26 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

类型化关系