第六章自底向上语法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动作 移进 移进 归约(A→b) 移进 归约(A→Ab) 移进
文法: ⑴ S→aAcBe ⑵ A→b ⑶ A→Ab ⑷ B→d
上例的分析说明了在第5步时是用 文法中的(2)还是(3)式归约的 原则是看分析栈中是否是句型的句 柄,如果是句柄,才是规范规约。
6.1 自底向上分析概述
自下而上分析原理: 所谓自下而上分析就是自左至右扫描输入 串,自下而上进行分析;通过反复查找当前句 型的句柄(最左直接短语),并使用产生式规则 将找到的句柄归约为相应的非终结符。这样逐 步进行“归约”,直到归到文法的开始符号; 或者说,从语法树的末端开始,步步向上“归 约”,直到根结点。
定义V上的一些关系
计算算符优先关系
略…
算符优先分析算法:
例6.3文法:
表6.7 对输入串 i+i # 的规范规约过程
步骤 1 # 分析栈 剩余输入串 i+i #
E->E+T|T T->T*F|F F->P↑F|P P->(E)|i
动作 移进 归约 P→i 归约 F→ P 归约T→F 归约E→T
2 3 4 5 6 7 8 9 10 11 12
步骤 1 2 3 4 5 6 7 8 9 10 11 符号栈 # # i1 #E # E+ # E+ i2 # E+E # E+E × # E+E × i3 # E+E × E # E+E #E 当前输入符号 剩余输入串 i1 + + i2 × × i3 # # # # +i2×i3# i2×i3# i2×i3# ×i3# i3# i3# #
#i #P #F #T #E #E+ #E+i #E+P #E+F #E+T #E
+i# +i# +i# +i# +i# i# # # # # #
移进 移进 归约P→i 归约F→P 归约T→F 归约E→E+T 接受
对应文法为:
观察表6.7的分析栈
# #i #P 分析栈
E->E+T|T T->T*F|F F->P↑F|P P->(E)|i
如何根据优先关系寻找符号串中的句柄?
一个例子:6.2例
有文法: ⑴ S→bAb ⑵ A→( B |a ⑶ B→Aa )
上表说明矩阵中元素要么只存在一种关系,要么为空。说明文法的任何句型中 没有出现符号对的相邻关系。 “#”表示句子括号,其优先级<所有符号,其他文法符号都>“#”。 即:“﹟” 的优先性小于所有与之相邻的文法符号的优先性。
构造关系表
例6.3文法 : ⑴E’→#E# ⑵E→E+T ⑶E→T ⑷T→T*F
⑸T→F ⑺P→(E) ⑻P→i
⑹F→P↑F|P
①求=关系:由⑴ ⑺式得:“#”= “#”,“(” =“)”
②求<关系:
③求>关系:
构造的优先关系矩阵如表6.5:
表达式文法算符优先关系表
由关系图法构造优先关系表
优先分析法分为:
简单优先分析法 算符优先分析法
特点
考虑所有文法符号之间 的优先关系,且这种优 先关系唯一
优先关系分类:
文法类型 简单优先文法 分析法名称
简单优先分析法
算符优先文法
算符优先分析法
只考虑终结符之间的优 先关系,且这种优先关 系唯一
简单优先分析法思路:
先确定文法中所有文法符号之间的优先 关系,然后根据这种优先关系寻找句柄 进行归约 其规约过程是规范规约
算符优先分析思想:
首先找出所有(算符)终结符之间的优先 关系,然后根据优先关系对输入串进 行分析,找到“句柄”就归约,但并不 考虑归约到哪个非终结符名 因而不是规范规约
6.2 简单优先分析法
简单优先分析法是按照文法符号的优先 关系确定句柄的 文法符号包括终结符和非终结符
6.2.1 优先关系:
E->E+T ->E+F ->E+P ->E+i ->T+i ->F+i ->P+i ->i+i
观察该推导,这正是表6.7的 规约过程,因而也是规范 规约(左规约)。
#F
#T #E #E+
#E+i
#E+P #E+F #E+T #E
其对应的规范推导应为右推导,即:
表6.8 对输入串 i+i# 的算符优先规约过程
由语法树看优先性:
a的优先性等于b
a的优先性小于b
a的优先性大于b
算符优先文法的定义(定义6.3)
对于某一文法G满足: 是算符文法 不含产生式 任意a、b( a、b∈VT)之间的优先关系 最多只有一种 文法G是算符优先文法(OPG)。
构造算符优先关系表:
方法一:由定义直接构造
若ai⋖aj或ai aj,则画一条从gaj到fai的有向边;
③ 对每个结点都赋予一个数,此数等 于从该结点出发所能到达的结点(包括出 发结点自身在内)的个数,赋给fai 的数作 为f(ai)值,赋给gaj的数作为g(aj)值; ④ 检查所构造出来的函数f和g,看它 们同原来的优先关系表是否有矛盾。如果 没有矛盾,则f和g就是所要的优先函数; 如果有矛盾,那么就不存在优先函数。
⑴ E->E+E ⑵ E->E*E ⑶ E->i
动作 移进 归约(3) 移进 移进 归约(3) 移进 移进 归约(3) 归约(2) 归约(1) 接受
算符文法的定义(6.1定义)
若一文法G中没有形如A→…BC… (A、B、C∈VN)的产生式(即两个非 终极符相邻),则称G为算符文法,也 称OG文法。
自下而上分析法是一种“移进—归约”法,这是因为 在自下而上分析过程采用了一个先进后出的分析栈。分析 开始后,把输入符号自左至右逐个移进分析栈,并且边移 入边分析,一旦栈顶的符号串形成某个句型的句柄时就进 行一次归约,即用相应产生式的左部非终结符替换当前句 柄。接下来继续查看栈顶是否形成新的句柄,若为句柄则 再进行归约;若栈顶不是句柄则继续向栈中移进后续输入 符号。不断重复这一过程,直到将整个输入串处理完毕。 若此时分析栈只剩有文法的开始符号则分析成功,即确认 输入串是文法的一个句子;否则,即认为分析失败。
第6章 自底向上优先分析法
基本知识点:自下而上语法分析的基本思想 和面临的问题,简单优先分析法,算符优先 分析法。 重点:算符优先关系矩阵的构造 难点:句型短语、句柄、最左素短语的寻找
自底向上优先分析法:
自底向上优先分析思想 简单优先分析法 算符优先分析法
自底向上分析思想:
任何时候栈中符号串和剩余符号串组成 一个句型,当句柄出现在栈顶符号串中 时,就用该句柄进行归约,这样一直归 约到输入串只剩结束符、栈中符号只剩 下开始符号,此时认为输入符号串是文 法的句子,否则报错。
的。因此,对一个终结符a而言,它应该有一个左优先
数f(a)和一个右优先数g(a),这样就定义了终结符的一 对函数。
构造优先函数的方法:
有两种:一种是关系图法;另一种由定义直接构 造。 (1) 用关系图法构造优先函数的步骤如下: ① 对所有终结符a(包括“#”),用有下脚标的fa 、 ga 为结点名,画出全部n个终结符所对应的2n个 结点; ② 若ai⋗aj 或ai aj,则画一条从fai到gaj的有向边;
6.3 算符优先分析法
按照运算符的优先顺序和结合性,确定 它们之间的优先关系。例如,乘法运算 比加法运算优先,于是有 ﹡ + 和 + ﹡ ;加法运算是左结合的, 所以 + +。
例如有文法: E->E+E E->E*E E->i 对输入串i1+i2*i3的归约过程如表6.3所示
有文法:
表6.3 对输入串i1+i2×i3的归约过程
如果根据一个文法的算符优先关系表,使得文法中 的每个终结符a和b满足下述条件:
(1) 如果存在a b, 则有f(a)=g(b);
(2) 如果存在a ⋗ b,则有f(a)>g(b);
(3) 如果存在a ⋖ b,则有f(a)<g(b)。 则称f和g为优先函数;其中,f称为入栈函数,g称为比较 函数。 一个终结符在栈中(左)与在输入串中(右)的优先值是不同
方法二:由关系图法构造
由定义构造优先关系表:
定义FIRSTVT 和 LASTVT集合
FIRSTVT(B)={b| B b…或B Cb…} LASTVT(B)={a| B …a或B …aC}
计算优先关系:
a的优先性等于b的优先性 :A→…ab…或A→…aBb… a的优先性小于b的优先性:A→…aB…,且b∈ FIRSTVT(B) a的优先性大于b的优先性:A→…Bb…,且a∈ LASTVT(B)
算符文法的性质:
在算符文法中任何句型都不包含两个相 邻的非终结符(性质1) 如果Ab(或bA)(A∈VN,b∈VT)出现 在算符文法的句型中,则中任何含b的 短语必含有A(性质2)
任意两终结符之间优先关系的定义(6.2):
设G是一个不含产生式的算符文法,a、b∈VT, A、B、C∈VN: a的优先性等于b的优先性是当G中含有 A→…ab…或A→…aBb… 产生式 a的优先性小于b的优先性当G中含有 A→…aB…,且B b…或B Cb… a的优先性大于b的优先性当G中含有 A→…Bb…,且B …a或B …aC
“句柄”实际上是最左素短语。算符优先 分析的关键是寻找最左素短语。 确定最左素短语…
6.3.5 优先函数:
用优先关系表来表示每对终结符之间的优先关 系存储量大、查找费时。如果给每个终结符赋
一个值(即定义终结符的一个函数f),值的大小
反映其优先关系,则终结符对a、b之间的优先 关系就转换为两个优先函数f(a)与f(b)值的比较。 使用优先函数有两个明显的好处:一是节省空 间;二是便于进行比较运算。
自底向上分析中的重要工作:
判断当前栈中符号串中哪些符号构成句 柄 归约:构成句柄就归约
文法G为:
例6.1 移进—归约对输入串abbcde#分析过程
步骤 1 2 3 4 5 6 7 8 9 10 11 符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S 输入符号串 abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
步骤 1 2 # #i 栈
F->F+F|i
动作 移进 归约 移进 移进 归约 归约 接受
优先关系
当前符号
i + + i # # #
剩余输入串
+i #
i# i#
3
4 5
#F
#F+ #F+i
#
6wenku.baidu.com
7
#F+F
#F
算符优先分析不是规 范归约!
最左素短语:
图6.6
图6.7
算符优先分析结论:
算符优先文法在归约过程中只考虑终结符 之间的优先关系,由此来确定“句柄”, 而与非终结符无关。只需要知道把当前 “句柄”归约为某一非终结符,不必知道 该非终结符的名字是什么。
6.2.2 简单优先文法的定义:
简单优先文法必须满足以下条件: 在文法符号集中V,任意两个符号之间最 多只有一种优先关系成立。 在文法中任意两个产生式没有相同的右 部。
简单优先分析算法:
1.将输入符号串a1a2…an#依次存入符号栈S中,直到遇到 栈顶符号ai的优先性大于下一个待输入符号aj时为止 2.栈顶当前符号ai为句柄尾,由此向左在栈中找句柄的头 符号ak,即找到ak-1 <ak的优先性为止 3.串ak …ai是句柄,在文法的产生式中查找右部为ak …ai 的产生式,用该产生式的左部替代该句柄,若没找到 合适的产生式则出错,此时断定输入串不是该文法的 句子 4.重复1、2、3步直到归约完输入符号串、栈中只剩文法 的开始符号为止
优先关系:等于、小于、大于 优先关系表示如下: X Y: 表示X和Y 的优先关系相等 X Y: 表示X的优先性比Y 的优先性大 X Y: 表示X的优先性比Y 的优先性小
对已知文法中的任意两个文法符号X,Y按其在句型中可
能出现的相临关系来确定它们的优先关系:
X Y 当且仅当G中存在产生式规则 A…XY... X Y 当且仅当G中存在产生式规则 A…XB…,且 B Y… X Y 当且仅当G中存在产生式规则 A …BD… 且有B …X 和D Y…
S→aAcBe A→b|Ab B→d
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进 归约(B→d) 移进 归约(S→aAcBed) 接受
步骤 1 2 3 4 5 6 …
符号栈 # #a #ab #aA #aAb #aA …
输入符号串 abbcde# bbcde# bcde# bcde# cde# cde#