编译原理(三)语法分析:2.上下文无关文法CFG和上下文无关语言CFL


【编译原理博客列表】》》》》》》


  • 上下文无关文法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的对应关系:

  1. 构造正规式的NFA;
  2. 若0为初态,则A0为开始符号;
  3. 对于move(i,a)=j,引入产生式Ai→aAj
  4. 对于move(i,ε)=j,引入产生式 Ai→Aj
  5. 若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.语法树与分析树的区别

实质上,语法树与分析树的最根本区别在于它们的内部节点(包括根节点):

  • 分析树的内部节点是非终结符,语法树的内部节点是操作符(运算符)
  • 语法树中省略了反映分析过程的非终结符。
  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值