第五章 自下向上分析语法分析方法(算符文法作业答2案)
第5章 语法分析——自下而上
B d
e
SaAcBeaAcdeaAbcdeabbcde SS→aAcBeB→d A→Ab A→b
每次归约的都是句型中的句柄。
22
算符优先分析法
LR分析法
23
1. LR分析法介绍
2. LR(0)分析表的构造
3. SLR分析表的构造
24
从左(Left,L)向右扫描输入串,构造一 个最右推导(Rightmost,R)的逆过程 进行规范归约(最左归约),每次归约 的都是真正的句柄; 对文法限制最少,是识别效率较强的方 法; 出错处理能力较强; 采用自动构造技术(构造LR分析表)
B
e
A
b
d
S → aAcBe A → Ab A→b B→d
b
分 析 树
输入串:abbcde
7
短语 直接短语 句柄
8
定义:设文法G的开始符号为S,是文法 *则称β是 的一个句型,若有SA且Aβ, + 相对于非终结符A的一个短语。 句型
短语是指句型中的某个部分,这部分可以由某 个非终结符推出。 可以利用语法树来找出句型中的所有短语。
查表 A[0,a]=s2,进栈 A[2,a]=s2,进栈 A[2,b]=s5,进栈 A[5,b]=r2,按第2条产生式归约 G[2,A]=3,进入状态3 A[3,b]=s4,进栈 A[4,#]=r1,归约 G[0,A]=1,进入状态1 A[1,#]=acc 31
对于一个文法,如果能够构造一张分析表, 使得它的每个入口均是唯一确定的,则我们 把这个文法称为LR文法。
33
前缀:字的任意首部。即移去符号尾
部零个或多于零个符号得到的一个符
号串。 例:abc的前缀有ε,a, ab, abc
第5章 语法分析——自底向上分析
(d) aAcBe归约为S
(e)
5.2自底向上分析方法的一般过程
自底向上分析方法,也称为移进归约法,其过程是: 设置一个寄存符号的先进后出栈,称为符号栈。在 分析进行时,把输入符号逐个按扫描顺序移进栈里, 当栈顶符号串形成句柄(即为某条规则的右部)时,就 归约,把栈顶构成句柄的那个符号串用相应规则左 部的非终结符号来代替。再检查栈顶是否又出现了 新的句柄,若有,继续归约;若没有形成新的句柄, 则再从输入符号串移进新的符号,如此继续直到整 个输入符号串处理完毕。最终如果栈里只有识别符 号,则所分析的输入符号串为合法的句子,报告成 功;否则,输入串是不合法的符号串,报告错误。
5.3.2 LR分析表的构成
分析表的动作有下列四种:
1. 移进(Sn):将输入符号aj移进符号栈,将状态n移进状态栈, 输入指针指向下一个输入符号。
2. 归约(R):当栈顶形成句柄时,按照相应的产生式U→W进 行归约。若产生式右部W的长度为n,则将符号栈栈顶n个 符号和状态栈栈顶n个状态出栈,然后将归约后的文法符号 U移入符号栈,并根据此时状态栈顶的状态Si及符号栈顶的 符号U,查GOTO标,将GOTO[Si,U]移入状态栈。
第5章 语法分析——自底向上分析
在自底向上的分析方法中,分析过程从输入符号串开始, 通过反复查找当前句型的句柄,并使用规则,将找到的 句柄归约成相应的非终结符号,直到归约到开始符号。
5.1 规范推导、规范句型和规范归约
规范推导就是最右推导,而通过规范推导能得到的句型 就是规范句型。规范归约也称为最左归约,是规范推导 的逆过程,即在分析的每一步,将当前句型的句柄归约 成相应的非终结符号。
5.3.2 LR分析表的构成
LR分析表是LR分析器的核心部分,它由两部分组成,一是动作部 分ACTION表,二是状态转换部分GOTO表。表中S1、S2、…、Sn 为分析器的各个状态;a1、a2、…、am为文法的全部终结符号及 右界符#;X1、X2、…、Xk为文法的非终结符号。
第五章 自下向上分析语法分析方法(LR)
S3 S5 S5 S11 r6 9 r5 9 r5 r2 acc 7 1
25
§5.5
SLR(1)分析
若有效项目集中存在冲突动作: 将b移进栈 I = { X . b, A . , 将归约为A B . }
将归约为B
设当前输入符号为a, 1. 若a = b, 则移进; 2. 若aFollow(A), 则用A 进行归约; 3. 若aFollow(B), 则用B 进行归约; 4. 其余情况报错.
26
构造SLR(1)分析表的方法是: 1 根据文法构造识别规范句型活前缀的 有穷自动机DFA( 同LR(0) ) 2 由DFA构造SLR(1)分析表
27
2 由DFA构造SLR(1)分析表
令包含S‘→ • S 的项目集Ik的下标k为分析器的初态 LR(0)分析表的ACTION和GOTO表的构造步骤如下: a) 若项目A→ • a属于Ik,且转换函数GOTO(Ik,a)= Ij , 当a为终结符时,则置ACTION[k,a]为Sj b) 若项目A→ •属于Ik ,则对a为任何终结符或‘#’,且 满足aFOLLOW(A)时置ACTION[k,a] = rj ,j为产生式 在文法G‘中的编号 c) 若GO(Ik,A)= Ij ,则置GOTO[k,A]=j,其中A为非终结符, j为某一状态号 d) 若项目S‘→S •属于Ik ,则置ACTION[k,#] = acc e) 其它填上“报错标志”
S
E
E T
#
(
E )
T
E, E-, E-(, E-(i 是句型E-(i)# 的活前缀。
i
6
6
识别活前缀的有穷自动机 例:G[S]:S→aAcBe[1] A→Ab[2] A→b[3] B→d[4] (S'→S[0]) 对句子abbcde,其可归前缀为: ab[3],aAb[2],aAcd[4],aAcBe[1],S[0]
编译原理-第五章习题答案
上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)
栈
# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT
上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F
编译原理:第五章-语法分析——自下而上分析
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
编译原理第三版 第五章 自下而上语法分析
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理 第五章 语法分析-自下而上分析
5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
第5章自上而下语法分析
否则 S L(G[Z])
存在主要问题: • 句柄的识别问题
主要方法: • 算法优先分析法 • LR分析法
3 3
1 .
自上而下分析的一般过程
给定符号串S,若预测是某一语法成分, 那么可根据该语法成分的文法,设法为S构造一棵语法树.
若成功,则S最终被识别为某一语法成分,即 SL(G[Z])其中G[Z]为某语言成分的文法. 若不成功,则 SL(G[Z])
21
5.2 LL(1)分析法
LL(k)文法是一种自上而下语法分析方法.它是从文
法的识别符号出发,生成句子的最左推导.它从左到右 扫描源程序,每次向前查看k(k>1)个字符,便能确定当 前应该选择的产生式,如果每次只向前查看一个字符, 则称为LL(1)文法.
22
5.2 LL(1)分析法
设有文法G[Z]: 定义:α是文法G的一个符号串 FIRST(α) = {a | α * aβ, a Vt , α,β V*}
消 除 所 有 左 递 归 的 算 法
14
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归 SQc Rbc Sabc ∴S+ Sabc
1.检查规则R是否存在直接左递归
2.把R代入Q的有关选择,改写规则Q 3.检查Q是否直接左递归
c A d
5
5
S=cad 3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个
G[Z]: Z→cAd A→ab|a
Z ·
c A d a Z · c A d b
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败) 但是还不能冒然宣布SL(G[Z]) 4. 回溯 即砍掉A的子树 改选A的第二右部 Aa 检查 a-a匹配 d-d匹配
第五章语法分析—自下而上分析
2019/10/17
中南大学软件学院 陈志刚
22
第五章 语法分析-自下而上分析
直观算符优先分析法使用两个工作栈。 OPTR--寄存操作符及#,初值为#,(输
入串末尾也加#) OPND--寄存操作数及结果,初值为空,最
后为运算结果。
2019/10/17
中南大学软件学院 陈志刚
23
第五章 语法分析-自下而上分析
2019/10/17
中南大学软件学院 陈志刚
14
S
a A c Be
A
bd
b S
第五章 语法分析-自下而上分析
S
a A c Be
Ab
d
S
aA
2019/10/17
c Bea A d
中南大学软件学院 陈志刚
c Be
15
四、 符号栈的使用
第五章 语法分析-自下而上分析
栈是语法分析的一种基本数据结构。’#’作为栈 底符号。
先乘除后加减,同级从左到右
考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E) 它的句子有几种不同的规范规约。
归约即计算表达式的值。归约顺序不同, 则计算的顺序也不同,结果也不一样。
如果规定算符的优先次序,并按这种规定 进行归约,则归约过程是唯一的。
2019/10/17
中南大学软件学院 陈志刚
21
第五章 语法分析-自下而上分析
一、直观算符优先分析法
首先必须定义任何两个可能相继出现的终结 符a与b的优先关系 三种关系
a<·b a的优先级低于b a b a的优先级等于b a·>b a的优先级高于b
注意:与数学上的<,>,=不同
编译原理自底向上的语法分析
规范前缀
或者终极符串
规范句型
一些相关概念
规范活前缀:满足如下条件之一的规范前缀称为规范 活前缀:
该规范前缀不包含简单短语;
该规范前缀只包含一个简单短语,而且是在该规范前缀的最 后(这个简单短语就是句柄);
Z ABb 规范活前缀:
规范前缀为 AB, ABb AB(不包含简单短语) , ABb(包含一个简单短语且在最后)
自顶向下语法分析回顾 自底向上语法分析的例子 自底向上语法分析的主要思想 自底向上语法分析的关键问题 一些相关概念
自顶向下分析例
自顶向下分析过程是从文法开始符出发,为所给输入串构造
最左推导的过程。
输入
句型
动作
P: (1) Z aBeA (2) A Bc (3) B d (4) B bB (5) B
移入型规范活前缀
归约:规范活前缀只包含一个简单短语,而且是在该规范
活前缀的最后;
可归约规范活前缀 :归约规范活前缀
Z ABb
规范前缀为 AB, ABb
规范活前缀: AB(不包含简单短语) --- 移入型规范活前缀
ABb(包含一个简单短语) --- 归约规范活前缀
自底向上分析知识关系图
推导(*)
句型(S *)
( E) E +T
每棵简单子树(只有一层的子树)的叶子节 点构成简单短语:T、E+T、i
最左简单子树的叶子节点构成句柄: T
一些相关概念
自顶向下的语法分析方法中曾介绍过: 推导:对句型中的非终极符用产生式右部替换
推导的逆过程称为归约
规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导的逆过程称为规范归约(最左归约)
分析动作:移入(shift),归约(reduce) 包含以下方法:
第五部分语法分析自下而上分析-
IF Xi为非终结符而Xi+1为终结符 THEN FOR LASTVT(Xi)中的每个a DO
置 a Xi+1
END
国防科技大学计算机系602教研室
例: 考虑下面的文法G(E): (1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
e
dBB
b
cccc
bAAAAAAA
aaaaaaaaaS
国防科技大学计算机系602教研室
S
a A c Be
A
bd
b
分析树和语法树不一定一致。 自下而上分析过程:边输入单词符号,边 归约。 核心问题:识别可归约串
国防科技大学计算机系602教研室
5.1.2 规范归约
定义:令G是一个文法,S是文法的开始符 号,假定是文法G的一个句型,如果有
国防科技大学计算机系602教研室
5.1.1 归约
采用“移进-归约”思想进行自下而上分析 。
基本思想:用一个寄存符号的先进后出栈, 把输入符号一个一个地移进到栈里,当栈顶 形成某个产生式的候选式时,即把栈顶的这 一部分替换成(归约为)该产生式的左部符号 。
国防科技大学计算机系602教研室
步骤: 1 2 3 4 5 6 7 8 9 10 动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)
栈STACK,把所有初值为真的数组元素F[P, a]的符号对(P,a)全都放在STACK之中。
国防科技大学计算机系602教研室
运算:
如果栈STACK不空,就将顶项逐出,记此 项为(Q,a)。对于每个形如 P→Q… 的产生式,若F[P,a]为假,则变其值为真 且将(P,a)推进STACK栈。
第5章自底向上优先分析技术
自顶向下分析法是从文法的识别符开始,试图推导出输入符号串;自底向上分析方法与自顶向下的分析方法完全相反,它从输入符号串出发,试图归约到文法的识别符。本章要点: 自底向上分析法的基本原理 简单优先分析技术 算符优先分析法 优先函数
自底向上分析方法
从语法分析的角度考虑,自底向上的语法分析过程就是以输入符号串为语法树的末端结点符号串,试图向着根结点方向向上构造语法树,使识别符号正是语法树的根结点。 基本思想:从输入串开始,朝着文法的开始符号进行最左归约,直到到达文法的开始符号为止。主要是进行移进或归约操作,采用最左归约。 注意:输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
‘#’用来表示句子括号‘#’的优先性<所有的符号,所有的符号 >’#’
例:设文法 S(R)|a|∧ RT TS,T|S 根据定义写出各个文法符号之间的优先关系?
S
(
R
)
a
∧
T
,
#
S
>
=
>
(
<
<
=
<
<
<
R
=
)
>
>
>
a
>
>
>
∧
>
>
>
T
>
=
,
<
<
<
<
=
#
<
=
简单优先文法定义
例 设文法 S(R)|a|∧ RT TS,T|S 运用简单优先分析算法对终结符号串=((a),a)进行检查是否是文法定义的句子?
5-第五章—自下而上语法分析-1-2节
短语条件: ⑴ αβδ是句型; ⑵ S αAδ;
Aβ
解:∵ 文法中没有 A 的产生式 ∴ 只找非空子串
有: T T+ T+i1 T+i1* T+i1*i2 + +i1
+i1* +i1*i2
i1 i1* i1*i2
* *i2 i2
对 β=T,α=
δ= +i1*i2 找A,满足:
E A +i1*i2
故这种语法分析方法也称为lr分析法l自左向右扫描输入串r做最右推导规范推导由于规范推导总是先替换最右边的v作为规范推导的逆过程进行规范归约时一定是先归约最左边的且此规约串右边一定都是v规范归约的语法分析过程使用栈存放归约过程中形成的符号串
第5章 自下而上语法分析
5.1 引言 5.2 规范归约分析法 5.3 算符优先分析法 5.4 LR分析法介绍
句柄
VT构成的符号串
栈 说明:
输入缓冲区
⑴ 移进、归约的实质:在移进过程中,若发现栈顶
呈现句柄,就用产生式的左部符号进行替换。
⑵ 人工寻找句柄的简便方法:
1)、做最右推导,逆过程得到规范归约,选取的 规约串就是句柄。
2)、做语法树,通过修剪子树,得到每一步的句柄。
分析树:语法分析过程用一个树来表示,称为~ 。 在自下而上分析过程中,每一步归约可以画出一个子 树,随着归约的完成,这些子树被连成一棵分析树。
归约序列:
iFT ++ + + i F T E E E E E…
进 归 归 归 进进 归 归…
i+i*i<=F+i*i<=T+i*i<=E+i*i<=E+F*i<=E+T*i
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。
所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。
讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。
即从树结尾开始,构造语法树。
所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。
自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。
即,识别可归约串的问题。
归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。
实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。
重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。
现举例说明。
例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。
步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。
第五章 语法分析 自下而上 4.0
A
b
d
aAbcde
S A c
aAcBe
B
e
a
B
e
d
3 符号栈的使用
规范归约用来作语法分析需要解决的问题: ①如何在句型中找出句柄?
②在相同的右部有不止一个产生式时,选哪一个?
①实现移进-归约分析的一个方便途径是用一个栈和一个输 入缓冲区,用#表示栈底和输入的结束
栈 # 输 入 w#
② 分析程序的动作
第五章 语法分析——自下而上分析
本章内容
自下而上分析基本问题
直观算符优先分析法
算符优先分析
LR分析法
语法分析
核心问题:句型分析 对任意上下文无关文法G = (V ,T ,P,S )
和任意w T *,是否有w L(G)? 若成立,
则给出分析树或(最左)推导步骤;否则,
进行报错处理。
记号使用说明:
#:语句括号(栈底 w后) θ:现行栈顶符 a:刚读入字符 OPTR:运算符栈 OPND:操作符栈
分析算法步骤: ①下一个输入符号读至a中; ②若a为i,则a—>OPND,转第一步; ③若θ 表达式 : a,则调用关于θ的处理程序(语义程序),处理子
E(1)θE(2) ;然后重新进入第3步;(其中, E(1) 、E(2)分 别为OPND栈的次栈顶和栈顶)
自底向上分析中的非确定性??
在每一步归约中,选择哪一个产生式以及匹配
哪一个位臵上的子串都可能是非确定的
这些非确定性导致分析过程会有很高的复杂性
改进的方法??
选择‚可归约串‛进行归约 在实用的自底向上分析中,总是选择某个‚可 归约串‛进行归约,可大大减少回溯
观 察
a θ …… E ( 2) E ( 1) … OPND
第5章 语法分析——自下而上分析
(1)EE+T|T (2)TT*F|F (3)FP↑F|P (4)P(E)|i
+ *↑i ( ) #
+ * ↑ i ( ) #
26
按定义,我们可得文法G终结符对的优先关系表,如下所示:
+ *↑i ( ) #
+ ⋗ ⋖ ⋖ ⋖⋖⋗ ⋗
* ⋗ ⋗ ⋖ ⋖⋖⋗ ⋗
↑⋗ ⋗ ⋖ ⋖⋖⋗ ⋗
i ⋗⋗⋗
⋗⋗
( ⋖ ⋖ ⋖ ⋖⋖≖
“可归约串”的不同定义,形成了不同的自下而上的分析方法。
例: “算符优先分析”中:“最左素短语”——“可归约串” “规范归约分析”中:“句柄”——“可归约串”
5
5.1 自下而上分析基本问题
3.自下而上分析的中心问题: 怎样判断栈顶的符号串的可归约性以及如何归约。
各种自下而上分析法的共同特点: 边输入单词符号(移进符号栈),边归约。
(2)Ab (3)AAb (4)Bd (1)SaAcBe
S
11
5.1 自下而上分析基本问题
2.规范归约
(1)定义:设α是文法G的一个句子,那么我们称序列αn, αn-1,…,α0 是α的一个规范归约,若此序列满足: ① αn=α; ② α0=S,S为文法开始符号; ③ 对任何i,0<i≤n,αi-1是经把αi的句柄替换为 相应产生式的左部符号而得到的。 规范归约是关于α的一个最右推导的逆过程。
P…ab…或P…aQb…的产生式;
(2) a⋖ b 当且仅当 G中含有形如 P…aR… 的产生式, 而R⇒b+…或R⇒ Q+b…; FIRSTVT(R)
(3) a⋗ b 当且仅当 G中含有形如 P…Rb…的产生式, 而R⇒ …+ a或R⇒ …+ aQ 。 LASTVT(R)
第五章 自下向上分析语法分析方法2
. (1) a = b当且仅当G中含有如下的产生式 A (2) a „ab„或A „ aBb „
<.
A
b当且仅当G中含有如下的产生式 + + „aB„,且B b„或B Cb„
(3) a . b当且仅当G中含有如下的产生式 > A „Bb„,且B + „a或B + „aC
12
以上三种关系存在语法子树如下图:
13
算符优先文法(OPG)的定义:设有一不含ε 产生式的算符文法G,如果对任意两个终结 . 符对a,b之间至多只有 = ,<. .> , 三种关系的 一种成立,则称G是一个算符优先文法( operator precedence grammar)(OPG文法)
14
例如:二义性文法
E E+E|E-E|E*E|E/E|E↑E|(E)|i
是寻找可归约串。对“可归约串”概念的不同定义, 就形成 了不同的自下而上的分析方法。在算符优先分析法中我们用“ 最左素短语”来刻画“可归约串”,在“规范归约”中,则用 “句柄”来刻画“可归约串”
3
例5.1 (1)S (2)A (3)A
设文法G[S]: aAcBe b Ab
(4)B
d
对输入串abbcde#进行分析,检查它是否是G[S]的句子: 最右推导为规范推导 自左向右的归约过程也称规范归约 对输入串abbcde的最右推导是
其中A、B为非终结符,a为终结符 ②若a∈FIRSTVT(B)且有产生式A B„
则有a∈FIRSTVT(A) LASTVT集: ①若有产生式A … a或A … aB ,则a∈LASTVT (A) , 其中A、B为非终结符,a为终结符 ②若a∈ LASTVT(B)且有产生式A …B 则有a∈ LASTVT (A)
第五章 (6)自底向上分析方法
X >Y X…A Y …
当且仅当存在一个产生式A→…XB…
XB
并有B+Y…
…… BC …
X ⊲Y :
…
当且仅当存在一个产生式A→…BC… .
并有B+…X,C*Y…
.
. ..… Y.
X
Y
文法G为简单优先文法如果满足: • 对于任意两个语法符号X和Y,至多成立一种 优先关系; • 任意两个产生式都具有不同的右部.
EE1 E1E1+ T1 | T1 T1T TT * F | F F(E) | i
)
i 实例
#
E FIRST E1 ,T1
E1 E1,T1
T1 T ,F ,( ,i
T T ,F ,( ,i
ห้องสมุดไป่ตู้F ( ,i
LAST E1 ,T1 ,T ,F ,),i T1 ,T ,F ,),i T ,F ,),i F ,),i
7
文法优先关系的确定
FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}
若有U…SiSj…: 则有Si Sj ; 若Sj有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})
Shift 3. M (L
Shift Shift
4. L Ma) 分析字符串:b(aa)b
Reduce[2]
Shift
#b(Ma
#b(Ma) ⊳
#b(L
⊳
#bM
#bMb
⊳
#Z
) b # Shift b # Reduce[4]