05第5章 语法分析——自底
自底向上语法分析
E E E
E + id *
E id
6
id
动作
栈
输入缓冲区
1) # id1+id2*id3# 例5.2 分析过程 2) 移进 #id1 +id2*id3# 3) 归约 E→id #E +id2*id3# E 4) 移进 #E+ id2*id3# 5) 移进 #E+id2 *id3# 6) 归约 E→id #E+E *id3# E 7) 8) 9) 移进 移进 归约 E→id #E+E* #E+E*id3 #E+E*E id3# # # # #
E E
E
E
E
* id
10
10) 归约 E→E*E #E+E 11) 归约 E→E+E #E 12) 接受
2014-6-13
id + id
移进-归约分析中的问题
1) 移进归约冲突 – 例5.2中的 6)可以移进 * 或按产生式 E→E+E归约 2) 归约归约冲突 – 存在两个可用的产生式 • 各种分析方法处理冲突的方法不同 • 如何识别句柄?
第5章 自底向上语法分析
5.1.1 移进-归约分析
•系统框架
–采用表驱动的方式实现 –输入缓冲区:保存输入符号串 –分析栈:保存语法符号—已经得到的那部 分分析结果 –控制程序:控制分析过程,输出分析结 果——产生式序列 –格局:栈+输入缓冲区剩余内容=“句型”
2014-6-13 2
移进-归约语法分析器的总体结构
23
例5.7 E→E+T|E-T|T T→T*F|T/F|F F→(E)|id, 试利用算符优先分析法对id+id进行分析
第五章 语法分析-自底向上分析方法
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
Stack
LR分析模型
LR分析表
Action矩阵:行代表状态,列代表输入 符,而矩阵元素则表示相应的分析动作: Shift / Reduce / Accept / Error 。 GoTo矩阵:行代表状态,而列则代表语 法符号(非终极符,终极符),而矩阵 元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个 文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中 IS(X)为LR(0)项目集IS的投影。
id
E→E+ T T→ id T→ (E)
E
7
S→E $ E→E +T
+
T→(E ) E→E +T
$
2 4
T
8
)
T→(E)
S→E $
E→E+T
GE的LRSM
LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
第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为文法的非终结符号。
语法分析--自底向上分析技术
• 质短语 • 算符优先识别算法
第五章 语法分析----自底向上分析技术
5.3算符优先分析技术
5.3.4算符优先文法句型的识别
• 质短语 • 算符优先识别算法
例 文法G[Z]: Z∷=E E∷=T|E+T T∷=F|T*F F∷=(E)|i 设有输入符号串i+(i+i)*i, 试识别它是否是文法的句子。
第五章 语法分析----自底向上分析技术
5.2 简单优先分析技术
5.2.1 优先关系与优先文法
5.2.2 简单优先分析技术的实现 5.2.3 简单优先分析技术的局限性及克服
第五章 语法分析----自底向上分析技术
5.2 简单优先分析技术
5.2.1优先关系与优先文法
• 寻找句柄的基本思想 • 优先关系及其应用 • 简单优先文法
5.3.1算符优先分析技术的引进 Tj<Ti 当且仅当文法G中存在形如U∷=…TjV…的规则,其中V=>Ti…或V=>WTi…;
+
Tj >Ti 当且仅当文法G中存在形如U∷=…VTi…的规则,其中V=>…Tj 或V=>…TjW。
+ 5.3.2算符文法 Z∷=E E∷=T|E+T T∷=F|T*F F∷=(E)|i 例 设有文法G[Z]:
例5.1
步骤 ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) ( 10) ( 11)
设有文法G[E]:E∷=E+E|E*E|(E)|i
栈 # #i #E #E* #E*i #E*E #E #E+ #E+i #E+E #E 输入 i*i+i# *i+i# *i+i# i+i# +i# +i# +i# i# # # # 动作 移入 归约 移入 移入 归约 归约 移入 移入 归约 归约 接受 E∷ =i E∷ =E+E E∷ =i E∷ =E*E E∷ =i 规则
编译原理讲义(第五章语法分析--自底向上分析技术)
优先关系
• 和书上的写法不一样,凑合用。 SiSj Si Sj Si Sj • 注意: , , 之间不同于=,>和<。 由Si Sj不能导出Sj Si。
优先关系的例子
• 文法:Z::=bMb M::=(L|a L::=Ma) • 语言:{bab, b(aa)b, b((aa)a)b, …} • 可以从语法树里面导出部分优先关系。
关系闭包和Warshall算法
• Warshall算法是利用矩阵计算关系传递闭包的方法。计 算B的传递闭包的算法伪代码如下: 对于外层循环,当 A = B; i=K的循环结束的时 for (i = 1; i<=n; i++) 候,满足:如果Si和 for (j=1; j<=n; j++) Sj满足Si R Si1, Si1 R { Si2, … Sin R Sj, 并 if (A[j,i]==1) 且im<K, 那么现在 for(k=1; k<=n; k++) A[i,j] = 1; A[j,k] = A[j,k]+A[i,k] }
基本方法(续)
• 归约中的动作有4类
– 移入:读入一个符号并把它归约入栈。 – 归约:当栈中的部分形成一个句柄(栈顶的 符号序列)时,对句柄进行归约。 – 接受:当栈中的符号仅有#和识别符号的时 候,输入符号也到达结尾的时候,执行接受 动作。 – 当识别程序觉察出错误的时候,表明输入符 号串不是句子。进行错误处理。
计算优先关系的例子P136
• 文法:S::=Wa W::=Wb W::=a • 将文法中的符号按照S,W,a,b排列。
0100 BHEAD= 0110 0000 0000
0010 0011 0000 0000
语法之自下而上分析
5
#aAb
cde#
即输入符号串已经归约为:#aAbcde#,根据上述算法, 下一步Ab和b都可以归约(它们都在符号栈的栈顶且有 产生式AAb和Ab)。假若判b为句柄,则可把b归约 为A,即符号串归约为:#aAAcde#。那么,后面的工 作无论怎样做,都无法归约成功。
例2,设有文法G[E]:
F
+ * ( ) i STACK EFT , ii
EE+T |T TT*F | F
F(E) | i
E 10 01 10 0 01 T 0 01 10 0 10 F 0 0 10 0 10
TE ,, ** E,+ TFE,,((
①数组元素初始化为FALSE(用0表示FF)II;RRSSTTVVTT((ET))=={{+*,,*(,,(i,} i} ② F[U从,b文]=法T中RU找E出(用形1表如示U);b…E或EU+TVFbI的R产TST生VT式*TF,(F并)=使F{对(,应(iE}的) 数F组元i 素
自下而上分析 采用最左归约即规范归约。
5.1 自底向上分析的一般过程
一、一般过程:
一般的自底向上分析法,也称为“ 移进—归约”法,其一 般过程为: (1)设置一个存放符号的栈称为符号栈,用于记录分析的过程和确 定下一步的动作。
(2)把输入符号按扫描顺序逐个移进栈里(符号栈),当栈顶的符号 组成的符号串形成一个句柄时(正好是某条产生式的右部),就进 行归约。即把该符号串用与它对应的产生式左部的非终结符号代 替,仍然置于栈顶。
a的优先级高于b 记为: a .> b a的优先级等于b 记为: a . b a的优先级低于b 记为: a<. b
第5章自顶向下语法分析方法
(A,b)
(B,a) (B,d) 推导成功
注意:#是输入结束符
以上最左推导所建立输入串acbad的语法树如图 所示。
S
a c b A B A B d
a
选择产生式是唯一的
在第 2 步推导时,当前要替换的非终结 符为 A ,面临的输入符为 c ,所以选择 A 的产生式来推导时,只能选产生式 A→cA,而不能选A→bB。同样,在第 5 步推导时,当前要替换的非终结符为 B , 面临的输入符为d,所以选择B的产生式 来推导时,只能选产生式B→d,而不能 选B→a。这样就保证上述每一步推导都 是确定的。
文法的特点
文法G2有以下两个特点:
(1)每个产生式的右部都由终结符号开始;
(2)如果两个产生式有相同的左部,那么它们 的右部由不同的终结符开始。 对于这样的文法显然在推导过程中完全 可以根据当前要替换的非终结符和输入符 号决定选择哪个产生式往下推导,因此分 析过程是唯一确定的。
示例二
【例4.3】若有文法G3[S]为: S→Aa S→Bb A→c A→dA B→e B→fB
不确定的语法分析方法――带回溯的自顶向下 分析法――实际上是一种穷举的试探方法,当 分析不成功时则推翻以前的分析退回到适当位 置再重新试探其余候选式可能的推导,这样需 要记录已选过的产生式,直到把所有可能的推 导序列都试完仍不成功才能确认输入串不是该 文法的句子而报错。由于在编译程序真正实现 时往往是边分析边插入语义动作,因而带回溯 的语法分析方法代价很高,效率很低,在实用 编译程序中几乎不用,因此对它实现的详细算 法不做介绍。
(S,a)
(A,c)
S→aAB
aca#
3 acAB
4 acε B 5 aca
语法分析-自下而上分析
#aAcd #aAcB #aAcBe #S
e# e# # #
归约(B→d) 移进 归约(S→aAcBe) 接受
在移进-归约过程中,何时归约?何时移进?
不能只看到栈顶出现某一产生式的右部就用相应产 生式归约,如在第5步时,栈中符号是#aAb,栈顶 符号串b,Ab都是产生式的右部符号,这时到底用 A→b 还是A→Ab归约不能确定。 为此引入了 可归约串的概念。
自下而上分析主要问题
主要问题
识别“可归约串”。
对“可归约串”概念的不同定义,就形成了 不同的自下而上的分析方法。
在“规范归约”中,则用“句柄”来刻画“可归
约串”。
在算符优先分析法中我们用“最左素短语”来刻
画“可归约串”;
相关概念
短语
令G是一个文法,S是文法的开始符,假定是文法G
+ * A 且 A 的一个句型,如果有:S 则称是句型 相对于非终结符A的短语。
直接短语
特别是,如果有 A (即有A→ 的产生式)则称是
句型相对于规则A 的直接短语。
句柄
一个句型的最左直接短语称为该句型的句柄。
子树与短语的关系
子树
语法树的某个结点连同它的所有后代组成了一棵子树, 只含有单层分枝的子树称为简单子树。
归约 (回顾)
推导定义
1.直接推导 “” α →β 是文法G的产生式,若有v,w满足: v=γ α δ ,w= γ β δ , 其中γ ∈V*,δ ∈V*(V代表字母表) 则称v直接推导到w,记作 v w 也称w直接归约到v 例:G: S→0S1, S→01
0S1 00S11 00S11 000S111 000S111 00001111 S 0S1
ch5自底向上语法分析
S
a A c Be
A
bd
b S
S
a A c Be
Ab
d
S
a A c Bea A c Be d
定义:假定是文法G的一个句子,我们称 序列
n, n-1, ,0 是的一个规范归约,如果此序列满足:
1 n= 2 0为文法的开始符号,即0=S 3 对任何i,0 i n, i-1是从i经把句柄替 换成为相应产生式左部符号而得到的。
E ( E) E+ E
i
i
i
i
◆归约即计算表达式的值。归约顺序不同,则计算的顺 序也不同,结果也不一样。
◆如果规定算符的优先次序,并按这种规定进行归约, 则归约过程是唯一的。
句子i+i-i*(i+i)的归约过程是:
(1) i+i-i*(i+i)
(2) E+i-i*(i+i) (3) E+E-i*(i+i)
F->(E)|i 求算符优先矩阵
由F->(E) 得 (≐)
终结符+‘#’
由E->E+T
T =*> i, 得 + ⋖ i T =*> T*F, 得 + ⋖ *
T =*> (E), 得 + ⋖ ( E =*> i, 得i ⋗ +
E =*> E+T, 得+ ⋗ + E =*> T*F, 得* ⋗ + E =*> (E), 得 ) ⋗ +
移进—归约分析(Shift-reduce parsing)
采用“移进-归约”思想进行自下而上分析。
基本思想:用一个寄存符号的先进后出栈,把 输入符号从左至右地移进到栈里,当栈顶形成 某个产生式的候选式时(可规约串),即把栈顶 的这一部分替换成(归约为)该产生式的左部符 号。这样逐步归约, 直至文法开始符。即从语 法树末端开始步步向上归约, 直至根结点。
编译原理 第5章
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
5-自底向上语法分析 小结
算符优先分析 重点
• 计算FIRSTVT集和LASTVT集 • 算符优先关系表
• 对给定的算符文法构造算符优先关系表 • 利用算符优先关系表判断该文法是否是算符优先
文法
• 算符优先分析过程
• 应用算符优先分析算法对给定的输入串进行移进-
归约分析,在分析的每一步能确定当前应移进还 是归约,并能判断所给的输入串是否是该文法的 句子。
算符优先分析 一般掌握
• 算符文法、算符优先文法的定义 • 算符优先关系的定义 • 了解算符优先分析法的优缺点和实际应用中的
局限性
LR分析 重点
• 概念: 活前缀、LR(0)项目、LR(k)项目、识别 • • • •
文法所有活前缀的DFA 构造LR(0)项目集规范族、 LR项目集规范族 构造LR(0)、SLR、LR 、LALR分析表 判断文法是否LR(0)、SLR、LR 、LALR文法 LR分析器的工作过程
第五章 语法分析
5.1 自下而上分析基本问题 5.2 算符优先分析 5.3 LR分析 5.4 YACC
重要概念
• • • • • •
自下而上分析面临的问题及解决 可归约串 短语、直接短语、句柄、素短语、最左素短语 移进-归约分析过程 ቤተ መጻሕፍቲ ባይዱ范归约过程 分清句柄和最左素短语的区别,进而分清算符优 先归约和规范归约的区别
编译原理自底向上的语法分析
规范前缀
或者终极符串
规范句型
一些相关概念
规范活前缀:满足如下条件之一的规范前缀称为规范 活前缀:
该规范前缀不包含简单短语;
该规范前缀只包含一个简单短语,而且是在该规范前缀的最 后(这个简单短语就是句柄);
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) 包含以下方法:
第5章+自底向上的语法分析
OPG优先关系的构造
1. 由算法构造算符优先关系 2. 由关系图构造算符优先关系(自学)
36
由算法构造算符优先关系 定义: FIRSTVT(B)={b|B=>+ b…,或B=>+ Cb…} LASTVT(B)={a|B=>+… a,或B=>+… aC} 构造优先关系: 1. ±关系:若有形如A→…ab… A→…aBb…的 产生式,则a ± b。 2. ≮关系:若有形如A→…aB…的产生式,b ∈ FIRSTVT(B),则a ≮b。 3. ≯关系:若有形如A→…Bb…的产生式,a 37 ∈ LASTVT(B),则a ≯ b。
7
自底向上分析方法的分类
寻找句柄的方法不同,就形成了不 同的自底向上分析方法。 优先分析法
简单优先分析法(句柄)
算符优先分析法(最左素短语)
LR分析法(句柄)
8
§5.2 短语、直接 短语及句柄
9
刻画“可归约串”
句型的短语 S =>* αAδ且 A =>+ β,则称β是句型αβδ 相对于非终结符A的短语。 句型的直接短语 若有A β,则称β是句型αβδ相对于非终 结符A 的直接短语。 句型的句柄 一个句型的最左直接短语称为该句型的句 柄。
直观算符优先分析法
为了易于理解算符优先分析法,先介绍 一种简单的算符优先分析法—直观算符优 先分析法。 四则运算的例子说明了运算的次序只与 运算符有关,而与运算对象无关。 因而直观算符优先分析法的关键是对一 个给定文法G,人为地规定其算符(终结符) 的优先关系,再根据任何两个可能相继出 现的终结符的优先关系对输入串进行归约。31
e
B A a S5
a
第五章 自底向上的语法分析概述
前缀? 前缀
构造一个判定归约规范活前缀的自动机 -- LR自动机 自动机 自动机构造LR分析表指导 由LR自动机构造 分析表指导 分析 自动机构造 分析表指导LR分析
LR 分析机制
规范活 前缀 LR分析表 分析表
a
… …
…
#
输入
LR驱动程序 驱动程序: 驱动程序 - shift(移入 :移入型规范活前缀 移入) 移入 移入型规范活前缀 - reduce(归约 可归约规范活前缀 归约):可归约规范活前缀 归约
一些相关概念
自顶向下的语法分析方法中曾介绍过: 自顶向下的语法分析方法中曾介绍过: 推导: 推导:对句型中的非终极符用产生式右部替换 推导的逆过程称为归约 规范推导: 规范推导:一个句型的最右推导称为该句型的 规范推导; 规范推导 规范推导的逆过程称为规范归约(最左归约) 规范句型(右句型 : 规范句型 右句型):从开始符通过规范推导得 右句型 到的句型; 到的句型 规范归约过程中产生的句型仍是规范句型 规范归约的过程也是对规范句型的最左简 单短语(句柄)进行归约的过程
Z ⇒ ABb 规范活前缀: 规范活前缀
规范前缀为 AB, ABb AB(不包含简单短语 , 不包含简单短语) 不包含简单短语 ABb(包含一个简单短语且在最后 包含一个简单短语且在最后) 包含一个简单短语且在最后
Z ⇒+ abcb 规范前缀为 a, ab, abc, abcb 规范活前缀: 包含一个简单短语且在最后) 规范活前缀 a (包含一个简单短语且在最后 包含一个简单短语且在最后 abc是不是规范活前缀? 是不是规范活前缀? 是不是规范活前缀 (不是,包含两个简单短语 和c) 不是, 不是 包含两个简单短语a和
a
b
e
编译原理 语法分析—自底向上分析技术
是算符优先文法。 + * ( + > < < * > > < ( < < < ) > > i > >
) i > < > < ═ < > >
5.2.4 算符优先文法句型的识别
1.质短语 质短语:句型中至少包含一个终结符号,且除它自 身外不再包含其他质短语的短语。 如文法 G[E]:E::=E+T|T T::=T*F|F F::=(E)|i 的句型E+T*F*i+i中的T*F和 i 是质短语。如何人工寻找 句型中的质短语?先找出一切短语,再从最短的找起。
1 2 3 4 5 6 7 8
i+(i+i)*i F+(i+i)*i F+(F+i)*i F+(F+F)*i F+(E)*i F+F*i F+F*F F+T
#< i >+ #< + < ( < i > + #< + < ( <+< i >) #< + < ( <+> ) #< + < ( = ) > * #< + <* < i > # #< + <* ># #< + >#
E+T*F*i+i中的短语和质短语? 句型分析中自动寻找质短语的思路: 先从左向右寻找质短语的尾终结符号, 再从右向左寻找质短语的头终结符号,
即,先找优先关系
(?) 再找优先关系
(?)
2.句型的识别 关于文法G[E],对输入符号串i+(i+i)*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所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
否则ω ∉L(G[S])
是一个面向目标的产生过程。
自底向上分析算法的基本思想为: + 若S⇐ ω 则ω ∈ L(G[S]) 否则ω ∉L(G[S])
G[S] ]
是一个基于目标的辨认过程
从句子ω开始,从左到右 扫描ω,反复用产生式的 左部替换产生式的右部、 谋求对ω的匹配,最终得 到文法的开始符号,或者 发现一个错误。
18
可归前缀与活前缀
β是相对于A的句柄 活前缀定义: ⇒ 对若S’ * αAω⇒αβω是文法G[S]的拓广文法G[S’]的 一个规 范推导,γ是αβ的前缀,则称γ是文法G的一个活前缀。 活前缀不含句柄右边的任意符号 可归前缀是含有句柄的活前缀。 可归前缀是含有句柄的活前缀。 对一个规范句型来说,活前缀可有多个,可归前缀只有一个。 拓广文法:引入一个新的开始符号S’,使文法开始符号不会出现 拓广文法: 1.活前缀已含有句柄的全部符号,表明产生式 →β的 右部 活前缀已含有句柄的全部符号, →β的 活前缀已含有句柄的全部符号 表明产生式A→β 在任何产生式的右部,从而使构造出来的分析器有唯一的接受 β已出现在栈顶 状态。 2.活前缀只含句柄的一部分符号 表明A→β 活前缀只含句柄的一部分符号, 2.活前缀只含句柄的一部分符号,表明 →β1β2的右部子串 例:对文法G[E]∶E→T|E+T|E-T T→i|(E) 进行拓广。 已出现在栈顶,期待从输入串中看到β 推出的符号 β1已出现在栈顶,期待从输入串中看到β2推出的符号 3. 活前缀不含有句柄的任何符号,此时期望 →β的右部所 活前缀不含有句柄的任何符号,此时期望A→β 解:S→E E→T|E+T|E-T T→i|(E) →β的右部所 推出的符号串
B→d
B A A a b b c d
5
问题: 相同非终结符有多个产生式时,选择哪一个替换? 即:如何保证唯一性。 为此回顾几个基本概念
6
.2 回顾短语、简单短语、句柄
定义 设αβδ是文法G[S]的一个句型, 若 存在S * αAδ,A + β, ⇒ ⇒ 则 称β是句型αβδ相对于A的短语, 特别的,若 有A→β, 则 称β是句型αβδ相对于A的简单短语。 一个句型的最左简单短语称为句柄。(最左体现了唯一性) ① 直观上,句型是一个完整结构,短语是句型中的某部分 (针对某非终结符)。S是一个句型,而不是一个短语(树根不是 短语)。 ② 短语形成的两个要素: ⇒ 1.从S可以推导出αAδ ,即S * αAδ; ⇒ 2.从A至少一次推导出β,即A + β。
分析: 分析: (1)已分析过的部分在栈中的前缀不同,可用状态来表示。 已分析过的部分在栈中的前缀不同,可用状态来表示。 前缀不同 (2)移进和归约后栈中的状态会发生变化 因此,引入一个新的状态栈来表示符号栈中的符号的目前状 因此,引入一个新的状态栈来表示符号栈中的符号的目前状 状态栈 当状态栈顶处于不同的状态时, 态,当状态栈顶处于不同的状态时,面临输入符号应采用不 同的动作(移进,归约,接受,报错)。 同的动作(移进,归约,接受,报错)。 用LR分析的分析表来表示不同状态下对于各输入符号应采取 LR分析的分析表来表示不同状态下对于各输入符号应采取 分析的分析表 的动作
10
文法G[S]: : 文法 (1) S→aAcBe → (2) A→b → (3) A→Ab → (4) B→d →
步骤 符号栈
1) ) 2) ) 3) ) 4) ) 5) ) 6) ) 7) ) 8) 8) # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
GOTO
3 3
7 1
对输入串abbcde#的LR分析过程 文法G[S]: : 文法 (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d Si:移进,并将状态 进栈 移进, 移进 并将状态i进栈 ri:用第 个产生式归约,同时状态 用第i个产生式归约 用第 个产生式归约, 栈与符号栈退出相应个符号, 个 栈与符号栈退出相应个符号,第i个 产生式的左部非终结符入符号栈, 产生式的左部非终结符入符号栈, 并把GOTO表相应状态入状态栈 并把 表相应状态入状态栈
s 回顾最左归约,最右推导 定义 若 α是文法G[S]的句子且满足下述条件, a A B e 则 称序列αn,αn-1,...,α0是α的一个最左归约。 A b c d 1. αn=α 2. α0=S b 3. 对任何i(0<i<=n),αi-1是从αi将句柄替换为相应产生式左部非终结符得 到的。 注:最左归约的逆过程是一个最右推导,分别称最右推导和最左归约为规 范推导和规范归约。 例 文法(1) S→aABe (2) A→b (3) A→Abc (4) B→d 符号串能最左规约到开 对句子:abbcde的最左归约: 始符号则为合法句子 (2) (3) (4) (1) abbcde <= aAbcde <= aAde <= aABe <= S s
15
开始
LR分析过程 分析过程
初始状态0和#入栈 读符号 根据栈顶状态和输入符号 查分析动作表 Y 归约 ? N
按产生式i归约 根据产生式i的右部符号 的个数,符号栈和状态 栈相应元素出栈 产生式i的左部符 号入栈
移进 ? Y
N 接受 ? Y 分析结束 N 错误
输入符号入符号栈 状态i入状态栈 读符号
第5章 语法分析 章
自底向上分析
1
内容提要
自底向上分析概述 回顾基本概念 LR分析方法 构造识别活前缀的DFA 构造LR(0)分析表 LR(0)分析器 SLR(1)分析器 LR(1)分析器 LALR(1)分析器
2
5.1 自底向上分析概述
自顶向下分析算法的基本思想为:
+
若S⇒ ω
G[S]
则ω ∈ L(G[S])
3 3
例 文法G[S]: (1) (1) S → aAcBe 判断句子abbcde是否合法 A A→b a a b a b A A b a b c A A A b a b c d B
B→d
(2) A → b (3) A → Ab (4) B → d A A A→Ab A b a b b a b A B A b d a b c s a A c B d e
如果: (2) (2) abbcde <= aAbcde <= aAAcde ...... 因为aAAcde不是句型
a
A
B
e
A b d c b
9
9
对句柄进行归约,可保证对产生式选择的唯一性。 问题:如何直观地看出句柄并进行归约? 移进-归约:用一个栈“记住”将要归约句柄的前缀,句柄未 形成前移进,形成后归约。 (1)将#压入栈中,作为栈底,将待分析句子读入一个符号作 为栈顶,重复步骤(2),若句子读完时,栈顶为开始符号, 则句子合法,否则不合法。 (2)当栈顶形成句柄时,进行归约(先将句柄出栈,然后将 产生句柄的非终结符入栈),归约后需要再检查栈顶是否形成 句柄,若形成句柄继续归约;若未形成句柄则读入下一个符号 压入栈顶。
对输入串abbcde#的移进-归约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子 S⇒ aAcBe ⇒ aAcde ⇒ aAbcde ⇒ abbcde ⇒
11
在移进-归约方式中,关键的问题在于判断在栈顶何 时形成句柄(何时移进和何时归约),以及句柄由 哪些符号组成(选用哪个产生式归约)。
GOTO[Si,X]=Sj 定义栈顶状态为Si, 当前文法符号为X时应转向的状态Sj, X为非终结符。
14
移进: ① 移进:把Sj= ACTION[Si,a]移入状态栈,把a移入符号栈 。其中i,j表示状态号。 归约: ② 归约:当在栈顶形成句柄β时,则用β归约为相应的非 终结符A,即文法中有A→β的产生式,若β的长度为r(即 |β|=r),则从状态栈和符号栈中自栈顶向下去掉r个符号, 即栈指针SP减去r。并把A移入符号栈内,Sj = GOTO[Si,,A] 移进状态栈,其中Si为修改指针后的状态栈顶状态。 接受: ③ 接受:当归约到文法符号栈中只剩文法的开始符号S时, 并且输入符号串已结束即当前输入符是‘#’,则为分析成 功。 报错: ④ 报错:当遇到状态栈顶为某一状态下出现不该遇到的文 法符号时,则报错,说明输入串不是该文法能接受的句子。
动作
移进 移进 归约(A→ 归约 →b) 移进 归约(A→ 归约 →Ab) 移进 移进 归约(B→ 归约 →d) 移进 归约(S→ 归约 →aAcBe) 接受
状态栈
0 02 024 023 0236 023 0235 02358 02357 023579 01
ACTION
S2 S4 r2 S6 r3 S5 S8 r4 S9 r1 acc
12
5.3 LR分析方法 分析方法
LR分析法的归约过程是规范推导的逆过程,所以LR 分析过程是一种规范归约过程。主要介绍LR(K)分 析技术 L——从左到右扫描输入串 R——构造一个最右推导的逆过程 K——向右顺序查看输入串的K个(K≥0)符号就可唯 一地确定分析器的动作是移进还是归约和用哪个产 生式归约
0 1 2 3 4 5 6 7 8 9 a S2
ACTION c e b d
# acc
GOTO S A B 1 3
r2 r3 r4 r1
S5 r2 r3
r2 r3 r4 r1
S4 S6 r2 r3 r4 r1
S8
r2 r3 r4 r1
r2 7 r3 r4 r1
S9
r4 r1
17
问题: 对于一个文法,如何确定状态集? 如何构造LR分析表? 为此引入两个概念:活前缀和可归前缀
S→aAcBe
A b (2) (3) (4) (1)b abbcde <= aAbcde <= aAcde <= aAcBe <= S 说明: abbcde是合法句子