编译原理(三)语法分析:2.上下文无关文法CFG和上下文无关语言CFL 您所在的位置:网站首页 while的句子3个简单句子 编译原理(三)语法分析:2.上下文无关文法CFG和上下文无关语言CFL

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

2024-02-14 23:49| 来源: 网络整理| 查看: 265

文章目录 一、CFG的定义1.定义3.12.产生式的读法3.终结符与非终结符书写上的区分4.产生式的缩写形式 二、CFG产生语言的基本方法:推导1.推导的定义2.上下文无关语言CFL3.句型和句子:4.最左推导和最右推导 三、正规式到CFG的转换四、分析树1.定义2.分析树与语言和文法的关系3.特性4.推导和分析树 五、语法树1.定义2.语法树与分析树的区别

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

上下文无关文法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用区分: → +

约定:

大写英文字母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.语法树与分析树的区别

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

分析树的内部节点是非终结符,语法树的内部节点是操作符(运算符);语法树中省略了反映分析过程的非终结符。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有