第6章 自底向上优先分析法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构造优先矩阵的一种简便方法:
STEP 1 对每个非终极符W求下面两种集合: + HEAD(W)= {S︱W S…, S∈(VN∪VT)} + LAST(W)={S︱W …S, S∈(VN∪VT)} STEP 2 对每个符号对Si,Sj填写优先关系矩阵元素(其中W,V∈VN): M[Si,Sj]= ﹒ ,如果有U→ …SiSj… = ﹒ M[Si,Sj]= ﹤ ,如果有U→…SiW…,且有Sj∈HEAD(W) M[Si,Sj]= ﹒ ,如果有U→…VW…,且有Si∈LAST(V) ﹥ 和Sj ∈HEAD(W) ∪ {W}
+
+ α…Si Sj…β
+
…Si
α
U …
…
β
V
Si
Sj …
图6.3 采用U→…VSj…的推导
4、有形如 U→…VW…的产生式,且有V + 和W Sj…
+ S αUβ α…VW…β α…Si Sj…β +
+
…Si
α
U
β
…
V
W …
Sj …
… Si
图6.4 采用U→…VW…的推导
一、自底向上分析的一般过程:
先设置一个寄存符号的栈,称为分析栈。其作用 是用来记录分析的历史和指示分析的下一步动作。 分析进行时,把输入符号一个一个地按扫描顺序 移进栈中,当栈顶符号形成一个句柄(即为某产生式 的右部)时,就进行一次归约,即把栈顶构成句柄的 那个符号串用相应的产生式左部符号来替换。 接着再检查在栈顶是否又出现了新的句柄,则再进 行归约,直至整个输入符号串处理完。 最终如果栈顶为文法的开始符号,则所分析的输入 符号串为合法的符号串,报告分析成功。 否则,是不合格的符号串,报告错误。
接受:分析成功。 报错:处理错误。
6.2 简单优先方法
一、概述
简单优先方法是一种简单直观,广为使用的自底向上的分 析方法。这种方法特别有利于分析表达式。 大家知道,在做算术式的四则运算时,为了保证计算过程 和结果的唯一性,人们作了统一的四则运算法则的规定。 这个法则的主要方面就是规定了运算符之间的优先顺序。 即先乘除后加减,同优先级的运算符先左后右(左结合 律)。还有先括号内后括号外的规定。 简单优先方法就是根据上述算术运算的计算原理而设计的 一种语法分析方法。
4、语法分析程序:
首先设置保存句型前端的S栈和输入串后端的T队列;
(1) 置初始状态: S(1):=‘#’, j:=1, k:=1
(2) 若 S(j)与T(k)无任何关系,则出错停机。 ﹒ (3) 若 S(j) T(k)或S(j)﹒T(k),则把T(k)送入S栈中,读下 = ﹤ 一符,转(2)。 ﹒ (4) 若S(j) T(k)则从S栈顶开始往前栈串Sk1 ,Sk1+1,…,Sj, ﹥ ﹒ 其中 Sk1为第一个使Sk1-1 ﹤ Sk1 ,然后用Sk1,Sk1+1,…Sj去查产生式表,
需要说明的是分析栈顶形成的候选式不一定是句 柄。例如,在第14步对栈顶为T,它是E的一候选式, 但它不是句柄,不能归约成E。 判定候选式是极为简单的事情,但判定句柄就不 那么容易。 而不同的自底向上方法给出不同的判定方法。
从上述例子可知,自底向上方法主要包括以下 四个动作: 移进:把输入流的头符读到分析栈中。 归约:把分析栈顶的句柄归约为一非终极符。
简单优先文法分析算法的主要思想就是找出当 前句型的句柄并归约之。
简单优先文法分析算法的主要思想是就是找出当前 句型的并归约之。
而给定一个句型X,寻找它的句柄是这样进行的: 对输入串从左向右进行扫描,每次只查看两个相邻 的文法符号,并由此得知什么时候查到句柄的尾Sj ,然 后再返过头来向句型左端进行加工,仍然只查看相邻的 两个文法符号,找出句柄的头Si。 此时就可以对句柄Si…Sj进行归约了。
若查到有相同右部的产生式即U
Sk1Sk1+1…Sj,
则从栈中退掉子串Sk1Sk1+1…Sj,并把U进栈;然后转(2)。 若查不到转出错处理。
(5) 若T(j)=‘#’,并且S栈的内容为# Z(Z为文法开始符号)则正 确停机。否则,出错停机。
2、简单优先文法的句柄
定理:设S1S2…Sn是简单优先文法的规范句型,其子串SiSi+1…Sj 是满足下列条件的最左子串: ﹒ Si-1 ﹤ Si Si ﹒ Si+1﹒ Si+2 ﹒…=Sj = = = Sj﹒ Sj+1 ﹥
}
则SiSi+1…Sj定是S1S2…Sn的句柄。 证明:略。 这个定理给我们提供了确定句柄的一种方法。
第6章 自wenku.baidu.com向上优先分析法
6.1 概述
原理:在采用自左向右扫描,自底向上分析的前提下,该类 分析方法是从输入符号串入手,通过反复查找当前句 型的句柄(最左简单短语),并使用文法的产生式把 句柄归约成相应的非终极符来一步步地进行分析的。 最终把输入串归约成文法的开始符号,表明分析成功。 自底向上分析方法的关键就是要找出当前句型的句柄 (或是它的变型),然后根据产生式判别将它归约成什么 样的非终极符号。 下面,我们结合具体的实现方法,介绍在分析过程中 如何来识别句柄的。我们首先介绍自底向上分析的一般过 程,再介绍两种常用的分析技术:简单优先分析法和LR分 析方法。
例:给定文法G(E):E→E +T |T T→T*F | F F→i| (E) 并假定输入串为(i+i)*i,考察自底向上的分析过程。 二、分析过程图表: 为了具体实现上的方便,我们仍统一约定以“#” 作为输入串的左右分界符(开始和结束标志)。作为 初始状态,先将符号串的开始标志“#”压入分析栈中, 作为栈底符号,则分析过程为:
第6章 自底向上优先分析法
【预习思考】
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ 什么是自底向上语法分析的策略? 什么是移进-归约分析? 移进-归约过程和自顶向下最右推导有何关系? 自下而上语法分析成功的标志是什么? 什么是可归约串? 移进-归约过程的关键问题是什么? 如何确定可归约串? 如何决定什么时候移进,什么时候归约? 什么是简单优先文法?什么是算符优先文法? 简单优先分析是如何识别可归约串的? 简单优先分析法的优缺点和局限性有哪些?
E→E +T |T T→T*F | F F→i| (E)
分析过程图表:
步骤 1 2 3 4 5 6 7 8 9 分析栈 输入串 # (i+i)*i# #( i+i)*i# #(i +i)*i# #(F +i)*i# #(T +i)*i# #(E +i)*i# #(E+ i)*i# #(E+i )*i# #(E+F )*i# 动作 移进 移进 归约 归约 归约 移进 移进 归约 归约 步骤 10 11 12 13 14 15 16 17 18 19 分析栈 输入串 #(E+T )*i# #(E )*i# #(E) *i# #F *i# #T *i# #T* i# #T*i # #T*F # #T # #E # 动作 归约 移进 归约 归约 移进 移进 归约 归约 归约 接受
M〔Si,Sj〕=
解:根据定义求出其优先关系矩阵(如下): Z M L b . ( a . )
Z → bMb M→a︱(L L→Ma)
Z M L b =
.
Z b M b a Z bMb
( L
=
=
. > . . < <
. > .
(
a )
. <
=
. . < <
. >
. >
. >
. >
=
.
Z bM b
( L Ma )
+ S… 2、有形如 U→…Si W…的产生式,且有 W j + 3、有形如 U→…VSj…的产生式,且有 V …Si + + 4、有形如 U→…VW…的产生式,且有 V …Si和W Sj…
1、有形如 U→… SiSj…的产生式
+ S α Uβ α…Si Sj…β
α
U … Si Sj …
β
图6.1 采用U→…SiSj…的推导
+ 2、有形如 U→…Si W…的产生式,且有 W Sj…
+ S αUβ α…Si W…β
+ α…Si Sj…β
α
U
β
…
Si W… Sj…
图6.2 采用U→…SiW…的推导
3、有形如 U→…VSj…的产生式,且有 V
S αUβ α…VSj…β
【学习指南】
简单优先分析法是自下而上语法分析的一种,它的算法简 单、直观、易于理解,所以通常作为学习其它自下而上语法分 析的基础。 为学好本章内容,同学们应复习有关语法分析的知识,如: 什么是语言、文法、句子、句型、短语、简单短语、句柄、最 右推导、规范归约基本概念。
【重难点】
◇ 通过本章学习后,同学们应该能知道简单优先文法的形式。 ◇ 对一个给定的简单优先文法能构造简单优先关系分析表,并 能判别所给文法是否为简单优先文法。 ◇ 分清规范句型的句柄和最左素短语的区别,进而分清算符优 先归约和规范归约的区别。
这种方法的基本思想为: 首先规定文法符号之间的优先关系,然后再利用这种关系, 通过比较句型中两个相邻的符号之间的优先关系来确定句型的 “句柄”并进行归约。
二、相邻关系:
设Si和Sj是文法G的任意两个符号,那么它们在句型中可相邻 出现的充要条件是必须满足下列条件之一:
1、有形如 U→… SiSj…的产生式
3、分析算法的要点:
﹥ STEP 1:找出第一个使Sj ﹒ Sj+1的Sj; ﹒ STEP 2:从Sj开始往回(左)找第一个使Si-1 ﹤Si的Si; STEP 3: 用SiSi+1…Sj去查产生式表的右部,并用相 应的左部符号代替(归约)句柄Si…Sj,若查不到,则 为出错。 STEP 4:重复上述过程,直至归约完为止。
E→E +T |T T→T*F | F F→i| (E)
步骤 10 11 12 13 14 15 16 17 18 19
分析栈 #(E+T #(E #(E) #F #T #T* #T*i #T*F #T #E
输入串 )*i# )*i# *i# *i# *i# i# # # # #
动作 归约 移进 归约 归约 移进 移进 归约 归约 归约 接受
三、优先关系:
为了把上述条件加以形式化,引进三种优先关系。其定义如下: Si ﹒ Sj 当且仅当存在形如下面的产生式U→ … SiSj … = ﹒ Si ﹤ Sj 当且仅当存在形如下面的产生式U→…SiW…, + 且有 W Sj… Si﹒ Sj 当且仅当存在形如下面的产生式U→…VW…, ﹥
* + 且有 V …Si和W Sj…
步骤 1 2 3 4 5 6 7 8 9
分析栈 # #( #(i #(F #(T #(E #(E+ #(E+i #(E+F
输入串 (i+i)*i# i+i)*i# +i)*i# +i)*i# +i)*i# +i)*i# i)*i# )*i# )*i#
动作 移进 移进 归约 归约 归约 移进 移进 归约 归约
【学习目标】
简单优先分析法是自下而上(自底向上)语法分析的一 种,特别适合于表达式的语法分析,由于它的算法简单直观 易于理解,因此,也是学习其它自下而上语法分析的基础。 通过本章学习大家应掌握:
◇ 对给定的文法能够判断该文法是否是简单优先文法 ◇ 对给定的简单优先文法能够判断该文法是否是简单优先文 法 ◇ 对给定的简单优先文法能构造简单优先关系表,并能利用 简单优先优先关系表判断该文法是否是简单优先文法。 ◇ 能应用简单优先分析算法对给定的输入串进行移进-归约 分析,在分析的每一步能确定当前应移进还是归约,并能 判断所给的输入串是否是该文法的句子。 ◇ 了解简单优先分析法的优缺点和实际应用中的局限性。
在实际使用这些优先关系去识别句子时,我们希望采用一种 简洁的方法去表示这些关系,优先关系矩阵是一种常用的方式。 其定义为: ﹒ ﹒ =, 当 Si = Sj ﹒ ﹒ ﹤, 当 Si﹤ Sj ﹒ ﹥, 当 Si ﹒ Sj ﹥ 空, 当 Si与Sj无关系(不相邻出现)时 例:设有文法Gz:Z → bMb M→a︱( L L→Ma) 求出其优先关系矩阵。
如对Gz我们有:
Z → bMb M→a︱( L L→Ma) HEAD LAST
Z b b
M ( ,a ) ,L ,a
L M ,( ,a )
四、简单优先文法的分析方法: 1、简单优先文法的定义: 定义:满足下面两个条件的文法称为简单优先文法: (1)任意两个符号至多成立一种优先关系。 (2)任意两个产生式具有不同右部。 为了处理方便,引进特殊符号#,并定义 ﹒ # ﹤ S,S ﹒ # (S∈VN ∪VT) ﹥