第五章自底向上优先分析法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这样我们就可以对已知文法对它的任意两个文 法符号X,Y按其在句型中可能会出现的相邻关 系来确定它们的优先关系。(注意‘≖’、 ‘⋗’、‘⋖’和数学中的‘=’‘>’ 、‘<’不同)
i+i-i i-i+i
优先关系
优先关系 – X≖Y 文法G中存在产生式A→···XY··· – X⋖Y 文法G中存在产生式A→···XB···,
S→bAb A→(B|a B→Aa)
X⋗Y 文法G中存在产生式A→···BD···,
* 且DB
···X, Y···
(由3S)→求bA⋗b关且系A :
···),A···B,A
a
可得:)⋗b,a⋗b,B⋗b
由B→Aa)且A
···),A a,A
···B
可得:)⋗a,a⋗a,B⋗a
为了表示简洁明了我们也可以把文法符号之间 的关系用矩阵表示,称作优先关系矩阵 。
优先关系矩阵
优先关系矩阵
矩阵中元素要么只有一种关系,要么为空, 元素为空时表示该文法的任何句型中不会出 现该符号对的相邻关系,在分析过程中若遇 到这种相邻关系出现,则为出错,也就可以 肯定输入符号串不是该文法的句子。 ‘#’号用来表示语句括号,‘#’号的优先级⋖ 所有符号,所有符号的优先级⋗ ‘#’号,当 然这里仅对与‘#’号有相邻关系的文法符号 而言 。
6) #aA
cde#
移进
7) #aAc
de#
移进
8) # aAcd
e#
归约(B→d)
9) #aAcB
e#
10) #aAcBe
#
11) #S
#
移进 归约(S→aAcBe) 接受
对输入串abbcde#的移进-规约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子
S aAcBe aAcde aAbcde abbcde
自下而上语法分析概述
自下而上语法分析的策略:移进-归约分析; 移进就是将一个终结符推进栈 归约就是将0个或多个符号从栈中弹出,根据产生式
将一个非终结符压入栈 移进-归约过程是自顶向下最右推导的逆过程(规范
归约)
自下而上分析一般过程
例:文法G:S → cAd
A→ a
A → ab
识别输入串w=cabd是否该文法的句子
对输入串abbcde#的移进-规约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子
S aAcBe aAcde aAbcde abbcde
上述每一步都是归约当前句型的句柄。且句柄出
现在符号栈栈顶,不会在栈中间,上述分析过程
并未真正解决句柄的识别问题。例如,对于上面 的例子,分析进行到第(5)步,当时栈内符号串 为aAb。根据该符号串,我们有规则A→Ab和规则 A→b。那么,符号串Ab和b都是某条规则的右部, 故都有可能被判别是句型的句柄。假如我们选择b 作为句柄,并把b归约为A,那么,最终就达不到 归约到S的目的。因而,我们也就无从得知输入串 abbcde是一个句子了。
A
A a !!!
cab d c ab d
A
ca b d
ca bd
归约过程形成的推导:S cAd cabd
S cAbd ??? S A
ca b d
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈 输入符号串
动作
1) # 2) #a 3) #ab
第五章 自底向Байду номын сангаас优先分析法
自底向上语法分析概述 简单优先分析 算符优先分析
自下而上语法分析概述
向下而上分析:该类分析方法是从输入符号串开 始,查找句柄,并使用规则把它归约成相应的非 终结符号。任何自底向上分析的关键,就是要找 出这种句柄 。 自下而上语法分析试图将一个字符串反向归约至 开始符号。
自下而上语法分析比自上而下语法分析更有效率, 对语法的限制更少。
可得: b≖A,A≖b,( ≖B,A≖a,a≖)
S→bAb A→(B|a B→Aa)
X⋖Y 文法G中存在产生式A→···XB···, 且B Y···
(2)求⋖关系:
由S→bAb,且A
(B,A
a)
可得: b⋖(,b⋖a
由A→(B且B (B···,B a···;B A···,
可得:(⋖(,(⋖a ,(⋖A
4) #aA
abbcde# bbcde# bcde#
bcde#
移进 移进 归约(A→b) 移进
5) #aAb
cde#
归约(A→Ab)
6) #aA
cde#
移进
7) #aAc
de#
移进
8) # aAcd
e#
归约(B→d)
9) #aAcB
e#
10) #aAcBe
#
11) #S
#
移进 归约(S→aAcBe) 接受
– 且B Y··· – X⋗Y 文法G中存在产生式A→···BD···,
–
且B ···X,D
*
Y···
如何确定两个文法符号之间的优先关系?
优先关系
文法G[S]: S→bAb A→(B|a B→Aa) 根据上面≖、⋗、⋖关系的定义,由文法的产生式 可求得文法符号之间的优先关系如下:
(1)求≖关系:由S→bAb,A→(B,B→Aa)
算法应考虑的问题
在自底向上分析中,如何寻找确定一个句型的句 柄是构造一个自左向右扫描,自底向上分析方法 必须要解决的一个问题。 在每一步中如何选择子串进行归约?
短语、直接短语、句柄
短语、直接短语、句柄的定义:
文法G[S],
*
S αAδ且A β则称β是句型αβδ相对
于非终结符A的短语。
若有A β则称β是句型αβδ相对于该规 则A → β的直接短语。
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈 输入符号串
动作
1) # 2) #a 3) #ab
4) #aA
abbcde# bbcde# bcde#
bcde#
移进 移进 归约(A→b) 移进
5) #aAb
cde#
归约(A→Ab)
一个句型的最左直接短语称为该句型的句柄。
简单优先分析法
简单优先分析法是按照文法符号(终结符和非 终结符)的优先关系确定句柄的,因此我们首 先介绍任意两个文法符号之间的优先关系是怎 样确定的,及如何构造优先关系表。
按照文法符号(包括终结符和非终结符)的优先 关系确定句柄。 首先定义优先关系的表示: X≖Y 表示X和Y的优先关系相等。 X⋗Y 表示X的优先性比Y的优先性大。 X⋖Y 表示X的优先性比Y的优先性小。