编译原理-清华大学-第5章-自底向上优先分析法(2+1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
1
自底向上分析法的基本思想
•从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。•工作方式:“移进-归约”方式。
2
分析程序模型
1)初态时栈内仅有栈底符“#”,读头指针在最左单词符号上。
2)语法分析程序执行的动作:
a)移进读入一个单词并压入栈内,读头后移;
b)归约检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号;
c)识别成功移进-归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符;
d)识别失败
语法分析程序语法表a+b……#
输出带#
3
例如:
有文法如下
(1)S→aAcBe
(2)A→b
(3)A→Ab
(4)B→d
问:语句abbcde是不是该文法的合法语句?
4
•例:设文法G(S):
(1) S aAcBe
(2) A b
(3) A Ab
(4) B d 试对abbcde进行“移进-归约”分析。bbcde b
bcde b cde de d
e
abbcde e
B c
A a S
B A a 5
成功11接受
2,3,4,1##S 10归约
##aAcBe 9移进
2,3,4e ##aAcB 8归约
e ##aAc d 7移进
de ##aAc 6移进2,3cde ##aA 5归约cde ##a Ab 4移进2bcde ##aA 3归约bcde ##a b 2移进bbcde ##a 1移进abbcde ##0动作输出带输入串栈步骤移进归约的分析过程G[S]:
(1)S →aAcBe
(2)A →b
(3)A →Ab
(4)B →d 6
遇到的问题:
(1)如何找出进行直接归约的简单短语?(2)找出的简单短语应直接归约到哪一个非终结符?
关键:
确定句柄.
常用的分析方法:
(1)优先分析法
(2)LR分析法
7
b d
b a
c e
S
A B A d b a c e S A B A d a c e
S
A B a c e A B S 没有语法树如何确定句柄?8
6.1 自底向上优先分析法概述•基本思想:
利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
•分类:
1、简单优先分析:对一个文法按一定原则求出所有符号即终结符号和非终结符号之间的优先关系,按照这种关系确定归约过程中的句柄.
特点:准确、规范,但分析效率底,使用价值不大.
2、算符优先分析:只规定算符(终结符号)之间的优先关系,不考虑非终结符号之间的优先关系,只要找到句柄就归约,不考虑归约到那个非终结符号。特点:不是规范归约,分析速度快,特别适合于表达式的分析.
9
6.2 简单优先分析法
•基本思想:
按照文法符号(终结符号和非终结符号)的优先关系(谁先规约)确定句柄
(1)相等关系X
Y :当且仅当G 中存在规则A→…XY…(2)小于关系X Y :当且仅当G 中存在规则A→…XB…,
且B Y…=
+>(3)大于关系X Y :当且仅当G 中存在规则A→…BD…,且B …X 和D Y…>
·=
+>=*>10•优先关系的形式定义:
注意:优先关系是有位置属性的
例:构造文法G[S]的简单优先关系表G[S]:S→bAb ,A→(B|a ,B→Aa )
11
(1)求关系:b A , A b , ( B , A a , a )
(2)求关系:观察每个非终结符和它左边的符号由S→bAb,且A (B , A a , 得b ( , b a 由A→(B , 且B A…,B (B… , B a…得( A , ( ( , ( a =+>=+>
=+>=+>=+
>
(3)求关系:观察每个非终结符和它右边的符号由S→bAb, 且A a, A (B , A …)得a b , B b , ) b 由B→Aa) , 且A a, A (B , A …) 得a a , B a , ) a >·=+>=+
>=+>
=+>=+>=+>
>·>·>·>·
>·>·
简单优先文法的定义:
(1)在文法符号集V中,任意两个符号之间最多只有一种优先关系成立。
(2)在文法中任意两个产生式没有相同的右部。
第一条必须满足是显然的,第二条若不满足则会出现规约不唯一
13
简单优先分析法算法
根据给定的简单优先文法构造出相应的简单优先关系表,设置分析栈S ,再根据如下算符步骤进行分析:
(1)将输入符号串a 1a 2…a n #依次逐个存入分析栈S 中,直到遇到栈顶符号a i 的优先性下一个待输入符号a j 时为止。
(2)栈顶当前符号a
i 为句柄尾,由此向左在栈中找句柄的
头符号a k ,即找到a k-1a k ,为止。
(3)由句柄a
k …a i 在文法的产生式中查找右部为a k …a i 的产生式,若找到则用相应左部代替句柄,若找不到则为出错。
(
4)重复上述三个步骤直到规约完输入符号串,栈中只剩文法的开始符号或出错为止。>·14