第3章 上下文无关文法与下推自动机
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3)若节点 n 的标注符号为 ,则 n 必为叶节点,且是其父节点 的唯一子节点。 例 3.3 设有一个上下文无关文法 G ({S , A},{a, b}; P, S ) P: S AS | a 其中 A SbA | SS | ba 下面给出的是文法 G 的一个推导树
1
S A
4
a 2 S 5
对于文法 G2 ,通过算法 3.2 又可以找出 A 是属于第 2 种情况的 无用符号。从 G2 中删去 A 以及含 A 的产生式,得到 G3 ({S},{a}; P3 , S )
的形式,则称 G 为一个上下文无关文法(简记为 CFG) 上下文无关文法产生的语言称为上下文无关语言 (简记为 CFL) 例如,在第 1 章中,我们曾经讨论过一个文法
其中
G2 (V2 , T2 ; P2 , S ) V2 {S , A, B}, T2 {a, b}
P2 : S aB | bA A a | aS | bAA B b | bS | aBB
9
3
S A
11
8
b 6
10
7
a
a
b
a
图 3.1 文法 G 的一个推导树Tr
2 9 6 10 这个推导树共有 6 个叶节点,从左到右依次为○,○,○,○, 11 8 ○,○,它们的标注符号构成一个终极符串 aabbaa 。后面将证明, 这个串就是 L(G) 中的一个元素。 上面的图中我们对每个节点加上序号,是为了便于说明问题。 一般情况下,推导树中的节点可以只写出标注符号,而不加序号或 其它名称。譬如,上面的推导树也可以画成
*
情况 2:对 (V T)* ,若 S ,则 中不含 X 。即 X 是不 出现在任何句型中的字符。这种情况下的无用符号 X 既可能是变 量,也可以是终极符。 算法 3.2 是寻找这种不出现在任何句型中的变量或终极符的算 法。这个算法的基本思想是 1) 所有出现在 S 产生式右边的变量和终极符都可以出现 在句型中; 2) 若已知 A 是可以出现在句型中的变量,则所有出现在 A 产生式右边的变量和终极符都是可以出现在句型中 的字符; 3) 反复使用 2) 直到找不出新的字符为止, , 剩下的变量或 终极符就是那些不出现在任何句型中的字符。 在文法中删去无用字符时,同时要删去包含这些字符的产生 式。
定义 3.3
设 G (V , T ; P, S ) 为一个 CFG, L(G) 。 如果在 S x x
*
的推导过程中,每一步都是对句型中最右(左)边的变量使用产生 式,则称这个推导为最右(左)推导。
3.2.4
上下文无关文法的歧义性
再次考察前面的文法 G 。显然有多个推导过程推出 L(G) 中的一 个串 aabbaa ,但它们所对应的推导树都是一样的,都是前面给出 的Tr 。换句话,我们可以说 aabbaa 只一个推导树。 有些 CFG 中,可能有这样的情况:一个终极符串对应两个(或 两个以上)不同的推导树。 例如, G1 ({S , A, B},{a, b}; P, S )
* *
3.2.3 最左推导与最右推导
再进一步考察前面给出的文法 G 和 G 的一个推导树 Tr 。这个推 导树产生的终极符串为 aabbaa 。 前面我们给出了这个终极符串的一 个推导。另外,我们还可以给出这个串的另一些推导,如: S aAS aAa aSbAa aSbbaa aabbaa (3.2) S aAS aSbAS aSbbaS aSbbaa aabbaa (3.3) 推导式(3.1)(3.2)和(3.3)的推导过程显见是不一样的。不过 、 仔细观察可以发现,它们都是通过 5 步推导从 S 推导出 aabbaa 。而 且这 3 个推导过程中,所使用到的产生式(包括每个产生式的重复 使用次数)都是一样的,只是顺序不一样而已。 (3.1)式的推导过 程中,每一步推导都是对句型中最左边的变量使用产生式; (3.2) 式的推导过程中, 每一步推导都是对句型中最右边的变量使用产生 式; (3.3)式的推导过程中,各步推导使用产生式的变量在句型中 的位置则是随意的。
形式语言与自动 机理论
2010-2011
第3章 上下文无关文法与下推自动机
本章讨论第 2 种类型的语言:上下文无关语言(context-free language)
上下文无关文法 上下文无关语言 下推自动机
上下文无关语言在程序设计语言和编译程序中有广泛的应用。
3.1 上下文无关文法(context-free grammer)
*
例:设 G1 ({S , A, B},{a, b}; P , S ) 1 其中 P : S AB | a
Aa 通过算法 3.1 和算法 3.2,可以找出 B 是第一种情况的无用符 号, b 是第二种情况的无用符号。因此从 G1 中删去 B 和 b (以及包 含它们的产生式) ,得到
G2 ({S , A},{a}; P2 , S ) P2 : S a Aa
3.2 推导树(derivation tree)
对于一个上下文无关文法 G ,如果 w L(G) ,那么从初始符 S 推导 出 w 的过程可以用一个节点带标注符号的树来描述。
3.2.1
推导树的定义和例子
定义 3.2 设 G (V , T ; P, S ) 为一个上下文无关文法, G 的推导树是 指满足下列条件的一个节点带标注符号的树Tr : 1)Tr 中的每个节点都有一个标注符号,其中根节点的标注符号为 初始符 S ,内节点的标注符号为变量集V 的元素,叶节点的标注符号 为终极符集T 的元素或者空串 ; 2)若内节点 n 的标注符号为 A , n 的子节点从左到右依次 为 n1 , n2 ,, nk ,它们的标注符号分别为 X1 , X 2 ,, X k ,那么 A X1 X 2 X k 是 G 的一个产生式;
把上述分析归纳为 3 条: 1) 空串 是回文,0 是回文,1 也是回文; 2) 如果 w 是回文,那么 0w0 是回文,1w1也是回文; 3) 除此之外,字母表{0,1}上再没有其它回文。 把这 3 点转化为形式表示,就可以得到产生{0,1}上的全体回文 的集合(即(3.1) )的文法如下: G ({S},{0,1}, P, S ) P: S | 0 |1 S 0S 0 |1S1 例 3.2 自己阅读(堂上给 5 分钟阅读)
例 3.1 构造一个上下文无关文法 G ,它所产生的语言为字母表 {0,1}上的全体回文的集合,即
L(G) w {0,1}*| w wR
(3.1)
为求解这个问题, 我们先分析一下回文的特点。 当一个回文 w 的 长度为偶数时,设| w | 2n, w的第 n 个字符与第 n 1个字符相同,第 n 1个字符与第 n 2 个字符相同,„余类推。当回文 w 的长度为奇 数时,设 | w | 2n 1,那么 w 的第 n 1个字符可以是字母表中的任 意一个字符,第 n 个字符与第 n 2 个字符相同,„余类推。因此, 我们只须找出长度为偶数的最短回文和长度为奇数的最短回文。 然 后从这些出发, 通过产生式规则,在任意一个回文的前后都加上相 同的字符,就可以得到一个新的回文。这样可以得到全体回文。
S aLeabharlann BaiduS a A b b S A a a
3.2.2
推导树与推导的关系
上面给出的文法 G 的一个推导树,这个推导树的叶节点的标注 符号从左到右按顺序排成的终极符串为 aabbaa 。 我们就说 aabbaa 是由这个推导树产生的。另一方面, G 中也存在一个推导 S aAS aSbAS aabAS aabbaS aabbaa (3.1) 从 S 推导出串 aabbaa 。 这种推导树与推导之间的关系不是偶然的。下面的定理说明这 一点。 定理 3.1 设 G (V , T ; P, S ) 为一个上下文无关文法, x T *。那 么 S x 当且仅当存在一个推导树产生 x 。 书上对这个定理给出了证明,这里不作细述。只是顺便指出, 书上证明的是一个更强的结论:对任意变量 A : A x 当且仅当存 在一个 A 树(以 A 为根节点标注符号的子推导树)产生 S 。由于 S 也是一个变量,因此所证明的结论涵盖了定理的内容。
其中
P:
S SA | SB | a Ab B b
容易知道 ab L(G) , 而且这个终极符串可以由两个不同的推导 树产生:
S
S
S
A
S
B
a
b
a
b
我们说它是两个不同的推导树,是因为它们所对应的推导过程 中所使用的产生式是不一样的。 左边的推导树对应的产生式有 S S A S , a 和 A ;b 右边的推导树对应的产生式有 S S B S , 和 a B 。b 由此,可以引出上下文无关文法和上下文无关语言的歧义性定 义。 定义 3.4 设 G (V , T ; P, S ) 为一个 CFG。若存在 x L(G) ,使得 有两个不同的推导树产生 x ,则称 G 为一个歧义文法。 定义 设 L 为一个 CFL, 如果产生 L 的每一个 CFG 都是歧义文 法,则称 L 为一个固有歧义的 CFL。
这个文法共有 8 个产生式,每个产生式都有定义 3.1 所规定的 形式。因此,它是一个上下文无关文法。它所产生的语言(第 1 章 已证明) :
L(G2 ) w {a, b} | w中a的个数等于b的个数
是一个上下文无关语言。 从给出的一个文法,我们可以通过推导、归纳来求出这个文法 所产生的语言表达式(当然,还要证明归纳出的语言表达式的正确 性) 。那么如果先给出一个语言表达式,是否可以求出产生它的一 个文法呢?对于那些比较简单的,典型的上下文无关语言,是有可 能做到的。
算术表达式 算术表达式 算术表达式 算术表达式 算术表达式 算术表达式 算术表达式 算术表达式 算术表达式 id
这些规则比用自然语言来说明“什么是算术表达式”更为明确、清 晰和简明。 定义 3.1 设 G (V , T ; P, S ) 为一个文法, 如果 G 中的产生式都有 A A V , (V T )*
3.3 上下文无关文法的化简
对于一个上下文无关语言 L ,可能有多个上下文无关文法产生它。 这其中可能不是最简的。所谓不是最简的,是指文法中包含无用的字 符或无用的产生式。 本节就是讨论怎样在一个文法中删去无用的字符 和无用的产生式。
3.3.1
无用字符
设 G (V , T ; P, S ) 为一个 CFG,字符 X V T ,如果存在一个推 导:
S X w
* *
, (V T ) *
w T *
那么就说 X 是文法 G 中的一个有用字符,否则说 X 是一个无用字符。
上下文无关文法化简的任务之一,就是要删去文法中出现的无 用字符。对文法中的无用字符,可以分成两种情况来讨论: 情况 1 :对 A V ,不存在 w T * 使得 A w 。这种情况的无 用字符只可能是变量。 算法 3.1 是找出那些不能推导出终极符串的变量的算法。这个 算法的基本思想是: 1) 若存在产生式 A w, w T *) ( ,那么从 A 可以推导出 终极符串; 2) 若已求出部分可以推导出终极符串的变量,且有产生式 A ,其中 只含终极符和那些已知可推导出终极符 串的变量,则从 A 也可以推导出终极符串; 3) 反复使用 2) 直到再也不能求出新的可推出终极符串的 , 变量。剩下的变量就为所求。
上下文无关文法最早是用于描述自然语言的一些规则。例如,自 然语言中的一个句子可以通过下列规则来确定: 句子 名词短语 动词短语
名词短语 形容词 名词短语 名词短语 名词 然而,对于自然语言,这种描述并不是完美无缺的。还涉及到语 义是否明确的问题(例如“桌子唱歌”虽然符合上述规则 ,语义却不 够明确) 。 把这种规则应用于计算机语言,却更为合适。例如,用 Backus 范式来表示程序设计语言的规则