当前位置:
文档之家› chapter 6-上下文无关语言
chapter 6-上下文无关语言
这个推导树共有6个叶节点,从左到右依次为2,9,6,10,11,8, 它们的标注符号构成一个终极符串aabbaa 。后面将证明,这个串就 是L(G) 中的一个元素。 上面的图中我们对每个节点加上序号,是为了便于说明问题。一般情 况下,推导树中的节点可以只写出标注符号,而不加序号或其它名称。 譬如,上面的推导树也可以画成
第六章、上下文无关语言
V ,T ,P ,S ) 为一个CFG, x L(G) 。如果在 S x 定义2: 设 G (
的推导过程中,每一步都是对句型中最右(左)边的变量使用产生 式,则称这个推导为最右(左)推导。
*
四、上下文无关文法的歧义性
再次考察前面的文法G。显然有多个推导过程推出L(G)中的一个串, 但是它们所对应的推导树都是一样的,都是前面给出的。换句话,我 们可以说只一个推导树。 有些CFG中,可能有这样的情况:一个终极符串对应两个(或两个以 上)不同的推导树。
第六章、上下文无关语言
上下文无关文法和它所描述的上下文无关语言,在定义程序设 计语言、语法分析、简化程序设计语言的翻译等方面有重要的 意义。 这是比有穷自动机和正则表达式能力更强的描述语言的方法。 内容:1、上下文无关文法 2、Chomsky 范式 3、对任何CFA都能找到一种具有特有形式的 等价的CFG (Context-Free Grammar) 例如:程序设计语言中的嵌套结构,用CFG描述而RG不行
*
第六章、上下文无关语言
情况2:对 (V T )* ,若S ,则 中不含X。即是X不出现 在任何句型中的字符。这种情况下的无用符号X既可能是变量,也可以 是终极符。 算法2是寻找这种不出现在任何句型中的变量或终极符的算法。这个算 法的基本思想是: 所有出现在 S 产生式右边的变量和终极符都可以出现在句型中; 若已知A是可以出现在句型中的变量,则所有出现在产生式右边的变量 和终极符都是可以出现在句型中的字符; 反复使用2),直到找不出新的字符为止,剩下的变量或终极符就是那 些不出现在任何句型中的字符。 在文法中删去无用字符时,同时要删去包含这些字符的产生式。
第六章、上下文无关语言
V ,T ,P ,S ) 为一个文法,如果G中的产生式都有 定义1:设 G (
A
A V , (V T )*
的形式,则称G为一个上下文无关文法(简记为 CFG) 上下文无关文法产生的语言称为上下文无关语言(简记为CFL)。 例如: G2 (V2 , T2 ; P 2, S) 其中, V2 {S , A, B}, T2 {a, b} 且
S aAS aAa aSbAa aSbbaa aabbaa S aAS aSbAS aSbbaS aSbbaa aabbaa
( (3)
推导式(1)、(2)和(3)的推导过程显见是不一样的。 不过仔细观察可以发现,它们都是通过5步推导从推导出 aabbaa 而且这3个推导过程中,所使用到的产生式(包括每个产生式的重复使 用次数)都是一样的,只是顺序不一样而已。(1)式的推导过程中, 每一步推导都是对句型中最左边的变量使用产生式;(2)式的推导过 程中,每一步推导都是对句型中最右边的变量使用产生式;(3)式的 推导过程中,各步推导使用产生式的变量在句型中的位置则是随意的。
S X w
*
*
, (V T ) *
w T *
那么就说 X 是文法G中的一个有用字符,否则说 X 是一个无用字符。 上下文无关文法化简的任务之一,就是要删去文法中出现的无用字符。 对文法中的无用字符,可以分成两种情况来讨论:
第六章、上下文无关语言
情况1 :对 A V ,不存在 w T * 使得 A w 。这种情况的无用 字符只可能是变量。 算法1 是找出那些不能推导出终极符串的变量的算法。这个算法的基本 思想是: 若存在产生式 A w ,(w T *),那么从A可以推导出终极符串; 若已求出部分可以推导出终极符串的变量,且有产生式 A ,其 中 只含终极符和那些已知可推导出终极符串的变量,则从 A也可以 推导出终极符串; 反复使用2),直到再也不能求出新的可推出终极符串的变量。剩下的 变量就为所求。
S a S a A b b S A a a
图3.2 文法的另外一个推导树
第六章、上下文无关语言
二、推导树与推导的关系
上面给出的文法G的一个推导树,这个推导树的叶节点的标注符号 从左到右按顺序排成的终极符串为 aabbaa 。我们就说是由这个 推导树产生的。另一方面,中也存在一个推导
S aAS aSbAS aabAS aabbaS aabbaa (1)
从S推导出串 aabbaa 。 这种推导树与推导之间的关系不是偶然的。下面的定理说明这一 点。 定理1: 设 G (V , T ; P, S ) 为一个上下文无关文法,x T * 。
那么
Sx
*
当且仅当存在一个推导树产生 x。
第六章、上下文无关语言
三、最左推导与最右推导
再进一步考察前面给出的文法G和G的一个推导树T。这个推导树产生 的终极符串为 aabbaa 。前面我们给出了这个终极符串的一个推导 。另外,我们还可以给出这个串的另一些推导,如:
V ,T ,P ,S ) 为一个CFG。若存在 x L(G) 定义3 设 G ( ,使得有两个不同的推导树产生x,则称为一个歧义文法。
定义4 设L为一个CFL,如果产生L的每一个CFG都是歧义 文法,则称为一个固有歧义的CFL。
第六章、上下文无关语言
五、化简
对于一个上下文无关语言,可能有多个上下文无关文法产生它。 这其中可能不是最简的。所谓不是最简的,是指文法中包含无用的字 或无用的产生式。本节就是讨论怎样在一个文法中删去无用的字符和 无用的产生式。 1、无用字符 V ,T ,P ,S ) 为一个CFG,字符 X V T ,如果存在一个推导: 设G (
*
G4 ({S , A},{a, b}; P4 , S ) P4 : S SB | aS | a Bb
*
第六章、上下文无关语言
例4 : 设 G1 ({S , A, B},{a, b}; P 1, S )
其中
P : S AB | a Aa
通过算法1 和算法2,可以找出B是第一种情况的无用符号,b是第二种 情况的无用符号。因此从 G1 中删去B和b(以及包含它们的产生式), 得到
G2 ({S , A},{a}; P2 , S ) P2 : S a Aa
可见 L(G) ,但文法 G1 中有一个空产生式 B 。从上下文 无关文法化简的要求,应该把这个空产生式删去。但是,如果只是简 单地划去这个空产生式,变为
G2 ({S , A, B},{a, b}; P2 , S ) P2 : S AB A aA | a Bb
第六章、上下文无关语言
A X1 A X1
,当 G 中存在产生式
X i1 X i X i1 X i1 X i1
Xn Xn
时,在 G ' 中增加一个产生式
(3)、从 G 中删去所有的空产生式,得到文法 G ' 。 根据这3步,对于例5 G1,消去空产生式 B 后得到的等价文法 应为
G3 ({S , A, B},{a, b}; P 3, S )
n
因此,当我们在一个文法中删去空产生式时,还需要添加上另外 一些产生式,以便原文法中出现的各种可能的推导在新的文法中 有所替代。 具体做法可分为3步。 (1)、找出中那些能够推导出空串的那些变量,设这些变量的 * 集合为
V { A V | A }
第六章、上下文无关语言
(2)、对每个 X i V
其中 P3 : S AB | A A aA | a B b
第六章、上下文无关语言
3、单产生式 在CFG中,对 A, B V , A B 称为单产生式。单产生式在文法中 也是不必要的。在文法中消去单产生式的工作相对比较容易,下面 分两种情况讨论。 情况1 ,设 A B 是文法 G 中的一个单产生式,如果 G中不存在 * A 1 A 2 型的推导,那么在删去单产生式 A B 的同时,把其 它各产生式出现的变量B都改为变量A。 情况2,设 A B 是文法中的一个单产生式,如果G中存在
那么 G2 产生的语言为 L(G2 ) {a b | n 1} 显然 L(G2 ) L(G1 ) 。之所以会出现这样的情况,是因为简 单地划去空产生式 B ,使得丢失了一些文法的推导。在 文法 G1 中,我们存在 S AB Ab an b n S AB A a 和 两类推导,而在文法 G2 中, 就只保留上面一种情况的推导,而丢失了下面一种情况的推导。 这显然同化简的初衷不相符。
第六章、上下文无关语言
例2 :设有一个上下文无关文法 其中 G ({S , A},{a, b}; P, S )
P:
S AS | a A SbA | SS | ba
1
下面给出的是文法的一个推导树
S A
4
a 2 S 5
9
3
S A
11
8
b 6
10
7
a
a
b
a
图3.1 文法的一个推导树
第六章、上下文无关语言
第六章、上下文无关语言
例 3:
G1 ({S , A, B},{a, b}; P, S )
其中 P: S SA | SB | a Ab B b
容易知道,ab L(G) 而且这个终极符串可以由两个不同的推导树 产生:
S S A
S S B
a
b
a
b
图3.3 两个不同的推导树
第六章、上下文无关语言
A 1 A 2 型的推导,那么在删去单产生式 A B 的同时,对 中的每一个 B 产生式 B 都添加一个产生式 A 。