文章目录
- 上下文无关文法CFG(Context Free Grammar)
- 上下文无关语言CFL(Context Free Language)
一、CFG的定义
1.定义3.1
CFG是一个四元组G =(N,T,P,S)
,其中
(1) N是非终结符(Nonterminals)的有限集合;
(2) T是终结符(Terminals)的有限集合,且N∩T=Φ;
(3) P是产生式(Productions)的有限集合,
A→α,其中A∈N(左部),α∈(N∪T)*(右部),
若α=ε,则称A→ε为空产生式(也可以记为A →);
(4) S是文法的开始符号(Start symbol),S∈N
【注意】
N是可以出现在产生式左边符号的集合,T是绝不出现在产生式左边符号的集合
例3.2 简单算术表达式的上下文无关文法可表示如下:
N = {E}
T = {+,*,(,),-,id}
P: E → E + E (1)
E → E * E (2)
E →(E) (3)
E → -E (4)
E → id (5)
S = {E}
2.产生式的读法
- 产生式中的记号
→
读作“定义为”或者“可导出”。 - “
E → E + E
”可用自然语言表述为“算术表达式定义为
两个算术表达式相加”。
或者“一个算术表达式加上另一个算术表达式,仍然是一个算术表达式”。
3.终结符与非终结符书写上的区分
- (一般用这个就行)用大小写区分:
E → id
- 用
""
区分:E → "id" E → E "+" E
- 用
<>
区分:<E> → <E> + <E>
约定:
- 大写英文字母A、B、C表示非终结符;
- 小写英文字母a、b、c表示终结符;
- 小写希腊字母α、β、δ表示任意文法符号序列。
4.产生式的缩写形式
当若干个产生式具有相同的左部非终结符时,可以将它们合并为一个产生式。
产生式以该非终结符命名。
例3.3 G3.1
P: E → E + E (1)
E → E * E (2)
E →(E) (3)
E → -E (4)
E → id (5)
重写为如下形式:
E → E + E (1)
| E * E (2)
|(E) (3)
| -E (4)
| id (5)
称其为E产生式
二、CFG产生语言的基本方法:推导
1.推导的定义
推到的定义将产生式左部的非终结符替换为右部的文法符号序列(展开产生式,用标记=>
表示),直到得到一个终结符序列。
推导的符号:=>
推导的输入:产生式左部
推导的输出:一个终结符序列
例3.4 用(G3.2)产生终结符序列
-(id+id)
可如下:
E → E + E (1)
| E * E (2)
|(E) (3) (G3.2)
| -E (4)
| id (5)
E => -E by(4)
=> -(E) by(3)
=> -(E+E) by(1)
=> -(id+E) by(5)
=> -(id+id) by(5)
定义3.2 利用产生式产生句子的过程中,将产生式A→γ的右部代替文法符号序列αAβ中的A得到αγβ的过程,称αAβ直接推导出αγβ,记作:αAβ=>αγβ。
根据推导的步数分类:
- 零步或多步推导(一个整体词语):
α1=*>αn
定义:对于任意文法符号序列α1,α2,…αn,均有α1=>α2=>…=>αn
其中α1=αn的情况为零步推导 - 至少一步推导:
α1=+>αn
定义:α1≠αn,即推导过程中至少使用一次产生式
推导的特性:
- 自反性:
∀
α
\forall{α}
∀α,有
α=*>α
,即推导具有自反性; - 传递性:若
α=*>β
,β=*>γ
,则α=*>γ
,即推导具有传递性。
2.上下文无关语言CFL
定义3.3
由CFG G所产生的语言L(G)被定义为:L(G) = { ω|S=+>ω and ω∈T* }
,L(G)称为上下文无关语言(Context Free Language, CFL),ω称为句子。
解析:
L(G)
是由句子ω
组成的集合,ω
由CFG的开始符号S
至少一步推导出的终结符T
序列(ω
是由终结符组成T
的)。
3.句型和句子:
若S=*>α
,α∈(N∪T)*
,则称α为G的一个句型。
若S=+>ω
,ω∈T*
,则称ω为G的一个句子。
句子∈句型
例子见下面的最左推导
4.最左推导和最右推导
定义3.4
在推导过程中,若每次直接推导均替换句型中最左边的非终结符,则称为最左推导。
由最左推导产生的句型被称为左句型。
类似的可以定义最右推导(也叫规范推导)与右句型。
例子:最左推导
E => -E => -(E) => -(E+E) => -(id+E) => -(id+id)
α1 α2 α3 α4 α5 α6
句型:αi都是
句子:α6
三、正规式到CFG的转换
从正规式到CFG的对应关系:
- 构造正规式的NFA;
- 若0为初态,则A0为开始符号;
- 对于
move(i,a)=j
,引入产生式Ai→aAj
; - 对于
move(i,ε)=j
,引入产生式Ai→Aj
; - 若i是终态,则引入产生式
Ai →ε
。
例3.11 从正规式r=(a|b)*abb的NFA构造CFG:
A0 → aA0|bA0|aA1
A1 → bA2
A2 → bA3
A3 → ε
推论3.1 正规式所描述的语言结构均可用CFG描述,反之不一定。
四、分析树
分析树是推导的图形表示
1.定义
定义3.5
对CFG G的句型,分析树被定义为具有下述性质的一棵树。
(1) 根由开始符号所标记;
(2) 每个叶子由一个终结符、非终结符、或ε标记;
(3) 每个内部结点由一个非终结符标记;
(4) 若A是某内部节点的标记,且X1,X2,…,Xn是该节点从左到右所有孩子的标记,则A→X1X2…Xn是一个产生式。若A→ε,则标记为A的结点可以仅有一个标记为ε的孩子。
2.分析树与语言和文法的关系
- 每一直接推导(每个产生式),对应一棵仅有父子关系的子树,即产生式左部非终结符“长出”右部的孩子;
- 分析树的叶子,从左到右构成G的一个句型。若叶子仅由终结符标记,则构成一个句子。
3.特性
- 越接近S的文法符号的优先级越低。
- 最终分析树的形状,仅与文法有关,而与推导方法无关
4.推导和分析树
最左推导和最右推导的中间过程对应的分析树可能不同,因为句型不同: -(id+E) 或 -(E+id)
但是最终的分析树相同,因为最终是同一个句子: -(id+id)
例3.5 再考察-(id+id)的推导过程。 E => -E => -(E) => -(E+E) => -(id+E) => -(id+id)
中间过程的分析树不同:
最终的分析树相同:
五、语法树
1.定义
定义3.6
对CFG G的句型,表达式的语法树被定义为具有下述性质的一棵树:
(1) 根与内部节点由表达式中的操作符标记;
(2) 叶子由表达式中的操作数标记;
(3)用于改变运算优先级和结合性的括弧,被隐含在语法树的结构中。
例3.6 句子-(id+id)
例:句型if C then s1 else s2
2.语法树与分析树的区别
实质上,语法树与分析树的最根本区别在于它们的内部节点(包括根节点):
- 分析树的内部节点是非终结符,语法树的内部节点是操作符(运算符);
- 语法树中省略了反映分析过程的非终结符。