在形式语言理论中,文法(Grammar)是描述语言结构的规则系统。根据生成能力的强弱,文法被分为四类:正则文法、上下文无关文法、上下文相关文法和无限制文法。以下是它们的详细解释及如何构造文法的思路。
一、四类文法的定义与特点
1. 正则文法(Type-3, Regular Grammar)
- 定义:
产生式规则仅允许以下形式之一:- 右线性文法: A → a B A \rightarrow aB A→aB 或 A → a A \rightarrow a A→a
- 左线性文法:
A
→
B
a
A \rightarrow Ba
A→Ba 或
A
→
a
A \rightarrow a
A→a
其中 A , B A, B A,B 为非终结符, a a a 为终结符。
- 能力:描述正则语言(Regular Languages),能被有限自动机(FA)识别。
- 应用场景:词法分析(如标识符、数字的正则匹配)。
- 局限性:无法描述嵌套或对称结构(如 a n b n a^nb^n anbn)。
例子:
语言
L
=
{
a
n
∣
n
≥
0
}
L = \{a^n \mid n \geq 0\}
L={an∣n≥0} 的正则文法:
S
→
a
S
∣
ϵ
S \rightarrow aS \mid \epsilon
S→aS∣ϵ
2. 上下文无关文法(Type-2, Context-Free Grammar, CFG)
- 定义:
产生式规则形如 A → α A \rightarrow \alpha A→α,其中 A A A 为非终结符, α \alpha α 为终结符和非终结符的任意组合。 - 能力:描述上下文无关语言(CFL),能被下推自动机(PDA)识别。
- 应用场景:编程语言的语法结构(如表达式、函数定义)。
- 局限性:无法处理上下文依赖(如变量声明与使用的关联)。
例子:
语言
L
=
{
a
n
b
n
∣
n
≥
0
}
L = \{a^nb^n \mid n \geq 0\}
L={anbn∣n≥0} 的 CFG:
S
→
a
S
b
∣
ϵ
S \rightarrow aSb \mid \epsilon
S→aSb∣ϵ
3. 上下文相关文法(Type-1, Context-Sensitive Grammar, CSG)
- 定义:
产生式规则形如 α A β → α γ β \alpha A \beta \rightarrow \alpha \gamma \beta αAβ→αγβ,其中 A A A 为非终结符, α , β , γ \alpha, \beta, \gamma α,β,γ 为符号串,且 γ \gamma γ 非空。 - 能力:描述上下文相关语言(CSL),能被线性有界自动机(LBA)识别。
- 应用场景:自然语言处理、需要上下文约束的语法(如变量必须先声明后使用)。
- 特点:规则中非终结符的替换依赖于上下文( α \alpha α 和 β \beta β)。
例子:
语言
L
=
{
a
n
b
n
c
n
∣
n
≥
0
}
L = \{a^nb^nc^n \mid n \geq 0\}
L={anbncn∣n≥0} 的 CSG:
S
→
a
B
C
∣
ϵ
,
B
C
→
B
b
C
c
,
B
→
b
,
C
→
c
S \rightarrow aBC \mid \epsilon, \quad BC \rightarrow BbCc, \quad B \rightarrow b, \quad C \rightarrow c
S→aBC∣ϵ,BC→BbCc,B→b,C→c
4. 无限制文法(Type-0, Unrestricted Grammar)
- 定义:
产生式规则形如 α → β \alpha \rightarrow \beta α→β,其中 α \alpha α 和 β \beta β 为任意符号串,仅要求 α \alpha α 至少包含一个非终结符。 - 能力:描述递归可枚举语言(Recursively Enumerable Languages),能被图灵机(TM)识别。
- 应用场景:理论计算机科学中的通用计算模型。
- 特点:无任何限制,但实际构造复杂,极少用于工程实践。
二、如何依据形式化语言构造文法?
1. 分析语言的结构
- 明确语言的定义(如 L = { a n b m c p ∣ m , n , p ≥ 0 } L = \{a^nb^mc^p \mid m, n, p \geq 0\} L={anbmcp∣m,n,p≥0})。
- 判断语言是否需要:
- 字符的嵌套(如 a n b n a^nb^n anbn)→ 需要 CFG。
- 上下文依赖(如 a n b n c n a^nb^nc^n anbncn)→ 需要 CSG。
- 简单线性结构(如 a ∗ b ∗ a^*b^* a∗b∗)→ 正则文法即可。
2. 确定文法类型
- 根据语言复杂度选择文法类型:
- 正则文法 → 线性结构。
- 上下文无关文法 → 嵌套结构。
- 上下文相关文法 → 上下文依赖。
- 无限制文法 → 通用计算(理论上)。
3. 分解非终结符
- 将语言分解为多个子任务,每个子任务对应一个非终结符。
- 例子:对
L
=
{
a
n
b
m
c
p
}
L = \{a^nb^mc^p\}
L={anbmcp},分解为:
- 生成
a
的部分 → 非终结符 S S S。 - 生成
b
的部分 → 非终结符 X X X。 - 生成
c
的部分 → 非终结符 Y Y Y。
- 生成
4. 编写产生式规则
- 递归生成:通过递归规则处理重复字符。
- 终结符与非终结符交替:确保每一步生成符合语言结构。
例子:构造
L
=
{
a
n
b
m
c
p
}
L = \{a^nb^mc^p\}
L={anbmcp} 的 CFG:
{
S
→
a
S
∣
X
生成任意数量的
a
X
→
b
X
∣
Y
生成任意数量的
b
Y
→
c
Y
∣
ϵ
生成任意数量的
c
\begin{cases} S \rightarrow aS \mid X \quad & \text{生成任意数量的 } a \\ X \rightarrow bX \mid Y \quad & \text{生成任意数量的 } b \\ Y \rightarrow cY \mid \epsilon \quad & \text{生成任意数量的 } c \\ \end{cases}
⎩
⎨
⎧S→aS∣XX→bX∣YY→cY∣ϵ生成任意数量的 a生成任意数量的 b生成任意数量的 c
5. 验证文法的正确性
- 生成典型字符串(如空串、最短串、边界情况)。
- 确保所有合法字符串可生成,非法字符串无法生成。
三、典型问题与构造方法
案例 1: L = { a n b n ∣ n ≥ 0 } L = \{a^nb^n \mid n \geq 0\} L={anbn∣n≥0}
- 文法类型:上下文无关文法(CFG)。
- 构造思路:
- 基础情况: n = 0 n = 0 n=0 → S → ϵ S \rightarrow \epsilon S→ϵ。
- 递归生成:每次生成一个
a
和一个b
→ S → a S b S \rightarrow aSb S→aSb。
最终文法:
S
→
a
S
b
∣
ϵ
S \rightarrow aSb \mid \epsilon
S→aSb∣ϵ
案例 2: L = { a n b m c p ∣ m , n , p ≥ 0 } L = \{a^nb^mc^p \mid m, n, p \geq 0\} L={anbmcp∣m,n,p≥0}
- 文法类型:上下文无关文法(CFG)。
- 构造思路:
- 分阶段生成
a
、b
、c
,每阶段对应一个非终结符。 - 通过递归规则生成任意数量的字符。
- 分阶段生成
最终文法:
S
→
a
S
∣
X
,
X
→
b
X
∣
Y
,
Y
→
c
Y
∣
ϵ
S \rightarrow aS \mid X, \quad X \rightarrow bX \mid Y, \quad Y \rightarrow cY \mid \epsilon
S→aS∣X,X→bX∣Y,Y→cY∣ϵ
案例 3: L = { a n b n c n ∣ n ≥ 0 } L = \{a^nb^nc^n \mid n \geq 0\} L={anbncn∣n≥0}
- 文法类型:上下文相关文法(CSG)。
- 构造思路:
- 同步生成
a
、b
、c
,确保数量相等。 - 使用上下文相关规则保持计数。
- 同步生成
最终文法(简化):
S
→
a
B
C
∣
ϵ
,
B
C
→
B
b
C
c
,
B
→
b
,
C
→
c
S \rightarrow aBC \mid \epsilon, \quad BC \rightarrow BbCc, \quad B \rightarrow b, \quad C \rightarrow c
S→aBC∣ϵ,BC→BbCc,B→b,C→c
四、总结
-
根据语言特征选择文法类型:
- 正则文法 → 线性结构。
- 上下文无关文法 → 嵌套结构。
- 上下文相关文法 → 上下文依赖。
- 无限制文法 → 通用计算。
-
构造文法的通用步骤:
- 分解语言结构。
- 设计非终结符和产生式规则。
- 递归生成与终结符交替。
-
验证:通过生成和推导检查文法的正确性。
掌握这些方法后,就可以针对具体的语言定义,系统地构造出符合要求的文法。