作者:郭黎初 · 更新日期:2026-04-10
CFG八字变向的实现方法
CFG(ContextFree Grammar,上下文无关文法)的"八字变向"通常指的是对文法进行变换以消除左递归、提取左公因子等操作,使其更适合于语法分析。以下是几种主要的实现方法:
1. 消除左递归
直接左递归消除
对于形如 `A → Aα | β` 的文法规则:
1. 将其改写为:
A → βA'
A' → αA' | ε
间接左递归消除
通过代入和重排规则来消除间接左递归。
2. 提取左公因子
对于有共同前缀的产生式:
A → αβ1 | αβ2 | ... | αβn | γ
提取公因子后变为:
A → αA' | γ
A' → β1 | β2 | ... | βn
3. 文法化简
包括:消除无用符号(不可达或不可派生终端的符号)
消除ε产生式(空产生式)
消除单位产生式(形如A→B的产生式)
4. 转换为乔姆斯基范式(CNF)或格雷巴赫范式(GNF)
乔姆斯基范式:
所有产生式形式为A→BC或A→a
需要引入新的非终结符分解长产生式
格雷巴赫范式:
所有产生式形式为A→aα(a为终结符,α为非终结符串)
实际实现步骤
1. 首先消除文法的ε产生式
2. 消除单位产生式
3. 消除左递归(直接和间接)
4. 提取左公因子
5. 最后转换为所需范式(如CNF或GNF)
这些变换保持了文法的语言生成能力,但改变了文法结构,使其更适合自顶向下或自底向上的语法分析算法。