【编译原理笔记】4.2 Context-free Grammar
1. 上下文无关文法的基本定义
1.1 四个核心组成部分
上下文无关文法(CFG)由四个基本要素构成:
a) 终结符号集合(Terminal Symbols)
定义:构成语言基本单元的符号,不可再分解
示例:在算术表达式中:
{id, +, -, *, /, (, )}特点:是语言的"字母表",出现在最终句子中
b) 非终结符号集合(Nonterminals)
定义:表示语法类别的变量,可被进一步展开
示例:
{expression, term, factor}作用:描述语言的层次结构
c) 产生式集合(Productions)
结构:
非终结符 → 符号序列组成:
头部(Head/Left Side):单个非终结符
体部(Body/Right Side):终结符和/或非终结符序列
示例:
expression → expression + term
d) 开始符号(Start Symbol)
定义:推导过程的起点非终结符
约定:通常列在第一个产生式
示例:
expression
1.2 算术表达式文法示例
完整文法定义:
a) 终结符号:{id, +, -, *, /, (, )}b) 非终结符号:{expression, term, factor}c) 产生式:expression → expression + termexpression → expression - termexpression → termterm → term * factorterm → term / factorterm → factorfactor → (expression)factor → idd) 开始符号:expression2. 文法表示约定
2.1 标准符号约定
为了简化描述,采用以下标准约定:
| 符号类型 | 表示方法 | 示例 | 含义 |
|---|---|---|---|
| 非终结符 | 大写字母 | A, B, S | 语法变量 |
| 终结符串 | 小写字母 | x, y, z | 终结符序列 |
| 任意符号串 | 小写希腊字母 | α, β, γ | 终结符和非终结符混合 |
| 开始符号 | 大写字母S | 推导起点 | |
| 选择运算 | 竖线| | or |
2.2 简化表示示例
原始文法:
expression → expression + termexpression → expression - termexpression → termterm → term * factorterm → term / factorterm → factorfactor → (expression)factor → id
简化表示:
E → E + T | E - T | TT → T * F | T / F | FF → (E) | id
3. 推导(Derivation)概念
3.1 推导的基本过程
定义:从开始符号出发,通过反复应用产生式替换非终结符的过程
推导步骤示例:
开始:E步骤1:E ⇒ -E (使用 E → -E)步骤2:-E ⇒ -(E) (使用 E → (E))步骤3:-(E) ⇒ -(id) (使用 E → id)结果:-(id)
3.2 重要概念定义
a) 句型(Sentential Form)
定义:如果 S ⇒* α(S是文法G的开始符号),则称α是G的一个句型
特点:可能包含非终结符,是推导过程中的中间形式
b) 句子(Sentence)
定义:不含非终结符的句型
特点:完全由终结符组成,是语言的合法字符串
c) 语言(Language)
定义:文法G生成的所有句子的集合,记作L(G)
公式:L(G) = {w | S ⇒* w, w是终结符串}
4. 推导的类型
4.1 最左推导(Leftmost Derivation)
规则:在每个句型中总是替换最左边的非终结符
示例推导:
E ⇒ E - E (替换最左E)⇒ (E) - E (替换最左E)⇒ (E + E) - E (替换最左E)⇒ (id + E) - E (替换最左E)⇒ (id + id) - E (替换最左E)⇒ (id + id) - id (替换最左E)
表示符号:⇒lm
4.2 最右推导(Rightmost Derivation)
规则:在每个句型中总是替换最右边的非终结符
表示符号:⇒rm
特点:与自底向上分析对应,也称为规范推导
5. 语法分析树(Parse Tree)
5.1 分析树的定义
分析树是推导过程的图形化表示,具有以下特性:
根节点:标记为开始符号
叶节点:标记为终结符或ε
内部节点:标记为非终结符
父子关系:如果A → X₁X₂...Xₙ是产生式,则节点A有n个子节点X₁,X₂,...,Xₙ
5.2 分析树示例
对于推导 E ⇒ -E ⇒ -(E) ⇒ -(id),对应的分析树:
E|-|E/|\( E )|id
5.3 推导与分析树的关系
多对一关系:多个推导可能对应同一棵分析树
唯一对应:每个分析树有唯一的最左推导和最右推导
结构表达:分析树忽略替换顺序,只关注语法结构
6. 二义性(Ambiguity)
6.1 二义性定义
定义:如果文法对某个句子生成多于一棵分析树,则称该文法是二义性的
等价表述:
对同一句子存在多个最左推导
对同一句子存在多个最右推导
6.2 经典二义性示例
问题文法:
E → E + E | E * E | -E | (E) | id
句子:id + id * id
两个不同的分析树:
树1:E → E + E 树2:E → E * E→ E + E * E → E + E * E→ id + id * id → id + id * id
优先级问题:树1表示(id + id) * id,树2表示id + (id * id)
7. 上下文无关文法与正则表达式的关系
7.1 表达能力比较
a) CFG可以描述RE
定理:对于任何正则表达式r,可以构造CFG G使得L(r) = L(G)
构造方法(NFA到CFG的转换):
为NFA的每个状态i创建非终结符Aᵢ
如果状态i在输入a上转移到状态j,添加产生式Aᵢ → aAⱼ
如果状态i在ε上转移到状态j,添加产生式Aᵢ → Aⱼ
如果状态i是接受状态,添加Aᵢ → ε
如果状态i是开始状态,使Aᵢ成为文法的开始符号
b) CFG比RE更强大
关键区别:CFG可以描述嵌套结构,而RE不能
示例语言:L = {aⁿbⁿ | n ≥ 1}
CFG描述:S → aSb | ab
RE无法描述:因为需要"计数"能力
实际应用:平衡括号、匹配的if-else、对应的begin-end等
7.2 实际意义
词法分析:使用正则表达式描述单词模式
语法分析:使用CFG描述程序结构
分工明确:词法分析处理简单模式,语法分析处理复杂结构
8. 示例与练习
8.1 语言生成示例
问题:为语言L = {aⁿbⁿ | n ≥ 1}写CFG
解答:
S → aSb | ab
推导验证:
n=1: S ⇒ ab n=2: S ⇒ aSb ⇒ aabb n=3: S ⇒ aSb ⇒ aaSbb ⇒ aaabbb
8.2 文法转换练习
正则表达式:(a|b)*abb对应的NFA状态转移
转换为CFG:
A₀ → aA₀ | bA₀ | aA₁A₁ → bA₂A₂ → bA₃A₃ → ε
