第五章 语法分析-自底向上分析方法
第五章 语法分析-自底向上分析方法
构造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}
编译原理_05自底向上的语法分析方法
例1:文法:
SaAcBe
A b A Ab
B d 输入串abbcde#分析 最右推导:
SaAcBe aAcde aAbcde abbcde
规约分析过程如下:
5
步骤 1 2 3 4 5 6 7 8 9 10 11
符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
11
步骤 1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11)
符号栈 输入符号串 # i+i*i# #i +i*i# #E +i*i# #E+ i*i# #E+i *i# #E+E *i# #E+E* i# #E+E*i # #E+E*E # #E+E # #E #
12
优先关系 #<i #<i>+ #<+ +<i +<i>* +<* *<i *<i># +<*># #<+>#
教学总结
算符优先关系表是指用表格形式来表示各终结 符号的优先关系的表。 为分析算符之间的优先关系,引入两个概念: firstVT集合和lastVT集合:对于非终结符B,有 firstVT (B)={b|Bb… 或 BCb…} lastVT(B)={a|B…a 或 B…aC} 为解决在算符优先分析过程中如何寻找句柄,引 进最左素短语的概念。 算符优先分析法只适用于对表达式的分析,其特 点是分析速度快。
对输入符号串自左向右进行扫描并将输入符自底向上分析方法的基本思想4逐个移入一个后进先出栈中边移入边分析一旦栈顶符号串形成某个句型的句柄时就用该产生式的左部非终结符代替相应右部的文法符号串称为归约
5第五章 自底向上语法分析法1
• 总结: 采用图的遍历完成自底向上的分析。
分析过程中有个急需解决的问题:谁先规约?
解决方法:通过比较终结符号之间的优先关系来确定谁 先规约。 由于自底向上的分析过程就是一个图的遍历过程,因此 分析程序通常会使用一个分析栈来辅助分析。 自底向上的分析开始时栈是空的,在成功分析的末尾就 只有开始符号。
文法G[A]={A→(A) | a}分隔如下:
A→.(A)
表示正准备开始分析
A→(.A)
表示(已被吸收,准备吸收A
A→(A.)
表示(A已被吸收,准备吸收)
A→(A).
表示(A)已被吸收,可以归约了
A→.a
表示正准备开始分析
A→a.
表示a已被吸收,可以归约了
有两个开始的地方,到底从谁开始? 解决方法:引入新的开始符号,扩充文法。
• LR(0)文法(LR(0) grammar): LR(0) 项DFA图的 所有状态均不存在移进-归约冲突(shift-reduce conflict) 和归约-归约冲突(reduce-reduce conflict) 。
移进-归约冲突:即某个状态不能既包含一个“移 进的”项目A→.X (X是一个终结符),又包含 一个如B→.的归约项。
$V+V *n
$V+V* n
$V+V*n
$V+V*V
$V+V
$V
• 试分析文法G[A]={A→(A) | a}所对应的串((a))。
(1)构造终结符优先关系表 (2)分析过程
分析栈 $ $( $(( $((a $((A $((A) $(A $(A) $A
输入串 ((a)) (a)) a)) )) )) ) )
主要内容
第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 规则
第五章 自下向上分析语法分析方法(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]
语法分析自下而上分析
LASTVT(P),就能够构造文法G的优先 表。构造优先表的算法是:
.
FOR 每条产生式P→X1X2…Xn DO FOR i:=1 TO n-1 DO
BEGIN
IF Xi和Xi+1均为终结符 THEN 置Xi Xi+1
.
文法G(E) (1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
的优先函数如下表
+ *↑( ) i # F2440660 G1 3 5 5 0 5 0
.
有许多优先关系表不存在优先函数,如:
ab a b
不存在对应的优先函数f和g 假定存在f和g,则有
TN
LA ( P ) S { a |P T a , 或 V P T a ,a Q V T 而 Q V N }
.
有了这两个集合之后,就可以通过检查每
所有终结符对。
➢假定有个产生式的一个候选形为 …aP…
那么,对任何bFIRSTVT(P),有 a b。 ➢假定有个产生式的一个候选形为
…Pb… 那么,对任何aLASTVT(P),有 a b。
栈STACK,把所有初值为真的数组元素F[P, a]的符号对(P,a)全都放在STACK之中。
.
运算:
如果栈STACK不空,就将顶项逐出,记此 项为(Q,a)。对于每个形如 P→Q… 的产生式,若F[P,a]为假,则变其值为真 且将(P,a)推进STACK栈。
上述过程必须一直重复,直至栈STACK拆 空为止。
17
ELSE ERROR /*调用出错诊察程序*/
编译原理讲义(第五章语法分析--自底向上分析技术)
优先关系
• 和书上的写法不一样,凑合用。 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章
例:有文法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
重要概念
• • • • • •
自下而上分析面临的问题及解决 可归约串 短语、直接短语、句柄、素短语、最左素短语 移进-归约分析过程 ቤተ መጻሕፍቲ ባይዱ范归约过程 分清句柄和最左素短语的区别,进而分清算符优 先归约和规范归约的区别
编译原理 第五章自底向上优先分析法
第五章自底向上优先分析法自底向上优先分析法,其基本思想是采用自左向右扫描,向下而上分析。
该类分析方法是从输入符号串开始,查找句柄,并使用规则把它归约成相应的非终结符号。
任何自底向上分析的关键,就是要找出这种句柄。
本章首先介绍自底向上分析一般过程,然后介绍算符优先分析法。
本章重点:句柄、算符优先分析法第一节自底向上分析一般过程。
先举例说明例1有一文法G[S]S→aAcBeA→bA→AbB→d对输入串abbcde#进行分析,检查该符号串是否是G[S]的句子。
它的最右推导是:S⇒aAcBe⇒aAcde⇒aAbcde⇒abbcde 由此我们可以构造它的逆过程即归约过程。
先设一个先进后出符号栈,并且把句子左括号“#”号放入栈底,其分析过程如下所示上述归约过程,是从输入符号串开始,自底向上地通过归约当前句型的句柄来建立语法树的。
我们不难画出上述分析过程的语法树,下图。
在图中,我们仅画出与生成语法树有关的几步。
从所建立的语法树,可以清楚看出,上述每一步确实都是归约当前句型的句柄。
且句柄出现在符号栈栈顶,不会在栈中间,其实上述分析过程并未真正解决句柄的识别问题。
例如,对于上面的例子,分析进行到第(5)步,当时栈内符号串为aAb。
根据该符号串,我们有规则A→Ab。
和规则A→b。
那么,符号串Ab和b都是某条规则的右部,故都有可能被判别是句型的句柄。
假如我们选择b作为句柄,并把b归约为A,那么,最终就达不到归约到S的目的。
因而,我们也就无从得知输入串abbcde是一个句子了。
在自底向上分析中,如何寻找确定一个句型的句柄是构造一个自左向右扫描,自底向上分析方法必须要解决的一个问题。
第二节算符优先分析法众所周知,作算术式的四则运算时,为了保证计算过程和结果的唯一性,必须要规定一个统一四则运算法则。
这种法则的主要方面,就是规定运算之间的优先顺序。
现在人们所遵循的统一法则是:乘除运算优先于加减运算,故在算术中要先作乘除运算后作加减运算;同优先级的运算符是先左后右(即左结合),先作左边的运算符的运算,后作右边运算符的运算。
第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
第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)进行检查是否是文法定义的句子?
编译原理 语法分析—自底向上分析技术
是算符优先文法。 + * ( + > < < * > > < ( < < < ) > > 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句型分析
步骤 句 型 关 系 最左质短语 归约到符号
按自底向上分析技术,句型分析的过程是一个不断 从语法分析树中剪去分支的过程。
Part5语法分析自底向上的语法分析(1)解读
Part5.语法分析——自底向上的语法分析(1)作业1.对于文法S→A A→BA A→εB→aB B→b(1) 构造LR(1)分析表;(2) 给出用LR(1)分析表对输入符号串abab的分析过程。
2.设已给文法(1)G1[S]:S→Aa|bAc|dc|bdaA→d(2)G2[S]:S→Aa|bAc|Bc|bBaA→dB→d试证明:G1是LALR(1)文法但不是SLR(1)文法;G2是LR(1)文法但不是LALR(1)文法。
3.试为如下的文法构造LALR(1)分析表。
E→E+T|T T→TF|F F→F*|a|b4.给出下面二义文法的语法分析表:E→E sub E sup EE→E sub EE→E sup EE→{E}E→c1.1自底向上分析的基本问题自底向上的语法分析方法,也称为移动归约分析法。
最易于实现的一种移动归约分析方法,叫做算符优先分析法,而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语法分析器的生成器。
移动归约分析法为输入串构造分析数时是从叶结点(底端)开始,向根结点(顶端)前进。
我们可以把该过程看成是把输入串ω“归约”成文法开始符号的过程。
在每一步归约中,如果一个子串和某个产生式的右部匹配,则用该产生式的左部符号代替该子串。
如果每一步都能恰当的选择子串,我们就可以得到最右推导的逆过程。
在实现上,就是说用一个寄存符号的先进后出栈,把输入符号一个一个的移进到栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分替换(归约)为该产生式的左部符号。
所有不同的自底向上分析法的一个共同特点就是,便输入单词符号(移进符号栈),边归约。
也就是从左到右移进输入串的过程中,一旦发现栈顶符号呈现可归约串就立即进行归约。
1.1.1句柄和归约非形式的,一个符号串的“句柄”是和一个产生式右部匹配的子串,而且把它归约到该产生式左部的非终结符代表了最右推导逆过程的一步。
形式的说,右句型(最右推导可得到的句型)γ的句柄是一个产生式A→β以及γ的一个位置,在该位置可以找到串β,而且用A代替β可以得到γ的最右推导的前一个右句型,即如果S=>*αAω=>αβω,其中ω全部由终结符构成,那么我们就说β是句型αβω的句柄。
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[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所示。
编译原理自底向上的语法分析
T T *F Fi
每棵子树的叶子节点构成短语: T+ (E+T)*i 、T、(E+T)*i、(E+T)、E+T、i
( E) E +T
每棵简单子树(只有一层的子树)的叶子节 点构成简单短语:T、E+T、i
最左简单子树的叶子节点构成句柄: T
第十一页,共21页。
一些相关概念
自顶向下的语法分析方法中曾介绍过:
句柄:一个句型的简单短语可能有多个,称最 左简单短语为句柄(handler);
– 例如:句型abBb,简单短语有两个:a,bB
Z ABb aBb abBb
– 最左简单短语a是句柄
句柄的唯一性:
– 如果一个CFG无二义性,则它的任意一个句型都 有唯一的句柄;
第九页,共21页。
短语、简单短语、句柄的例子
活前缀的最后;
可归约规范活前缀 :归约规范活前缀
Z ABb
规范前缀为 AB, ABb
规范活前缀: AB(不包含简单短语) --- 移入型规- 归约规范活前缀
第十六页,共21页。
自底向上分析知识关系图
互逆
特例 特例
推导(*)
句型(S *)
短语(A +) 简单短语(A )
第六页,共21页。
5.1 自底向上语法分析方法概述
主要思想:
– 从输入串出发; – 尽可能地找到可归约子串并将其归约成一个非终极符; – 直到归约成文法的开始符或发现语法错误;
分析动作:移入(shift),归约(reduce) 包含以下方法:
– LR 类的方法; 简单优先法; 算符优先法
关键问题:
a b cb
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
# X1 X2 … Xk A Si0 Si1 Si2 … Sik
Sik的A输出边所指向的状态设为S*,则格局变为:
# X1 X2 … Xk A Si0 Si1 Si2 … Sik S*
LR(0)分析
Input a1 … ai … an #
St Xt … …
LR分析驱动器
Output
action
goto
⊳
⊲
⊲
定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 Xi+2 … Xj-1 Xj ⊳Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ⊲用来确定句柄的头; 用来确定句柄 的内部; ⊳用来确定句柄的结束。
简单优先分析算法要点
线性正则式状态机-LRSM
线性正则式:不含*符号的正则表达式
LRSM:(Linear Regular States Machine) (1)从LRSM可构造出恰好接受给定所有正 则式的确定自动机DA; (2)从LRSM的终止状态可判定接受的是哪 个正则式; (3)从LRSM的状态可判定一个正则式是不 是另一正则式的前缀。
项目:假设[P]是一个正则式,则我们称形 如[P]的表示为项目,其中P是正则式编号。 其中黑点可出现于任何位置上。 项目集:用IS表示 IS(X) : SubItems(IS,X)= {X[P]|X[P]IS,XSymbSet} 简记为IS(X)
假设有线性正则项集:
[1] 对每个符号XSymbSet:
若ISiX非空,给ISiX标上NO,并在ISi和ISiX之间 画有向X边:ISi → ISiX。 [2] 给ISi标上OK。 ■ 重复上述步骤二,直至在LRSM中没有被标记为NO的
状态(项目集)节点为止。
S0 •abc[1] •abd[2] a •ad[3] •bec[4] •bed[5] b S2 b•ec[4] b•ed[5]
#b
#b( #b(a #b(M #b(Ma #b(Ma) #b(L #bM #bMb #Z
⊲ ⊲ ⊲ ⊳
(aa)b#
aa)b# a)b# a)b# )b# b# b# b# # #
⊳ ⊳
⊳ ⊳
5.3 LR类分析方法
•规范句型:用最右推导导出的句型(也称右句
型)。 •规范前缀:若存在规范句型,且是终极符 串或空串,则称为规范前缀。 •规范活前缀:若规范前缀不含句柄或含一个 句柄并且具有形式=(是句柄),则称规范前 缀为规范活前缀(简称活前缀)。 •归约规范活前缀:若活前缀是含句柄的活前 缀,即有=,且是句柄,则称活前缀为归 约规范活前缀(简称归约活前缀)。
例:构造LR(0)状态机 SE$ EE+T ET T id T ( E )
0
T (
9
T
6
S→ E $ E→ E+T E→ T T→ id T→ ( E )
E→T
5
id
+
T→id
id
(
T→( E) E→ E+T E→ T T→ id T→ ( E )
(
E
1 3
简单优先分析中的三种关系
Y :当且仅当存在一个产生式A→…XY… X ⊲ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 X ⊳ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。
X 文法G为简单优先文法如果满足:
对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
展望符:Lookup(S) 有效前缀集 Prefix(S) 状态Si中的项目•[P]表示部分已被输 入,而且是Si的前缀的后缀,表示待输 入部分。 可构造接受给定正则式集合的DA 严格前缀:某状态中既含有定位点在尾处 的项目又含有定位点不在尾处的项目,则 一个正则式是另一个正则式的严格前缀。
例有文法G[S]: S → aAc[1] A → Abb[2] A → b[3]
可归前缀集: aAc aAbb ab
LR(0)项目:若A→是产生式, 则称A→为LR(0)项目(简称项目),也 写作[p]形式。 项目集的投影:假设IS是LR(0)项目集,则 称下面IS(X) 为IS关于X的投影集: IS(X) = {A→X |A→XIS, X(VTVN)}. 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS {A→ | Y→ACLOSURE(IS) A→是产生式 }
设当前格局是:
# X1 X2 … Xk … Xt Si0 Si1 Si2 … Sik … Sit
# X1 X2 … Xk … Xt ai Si0 Si1 Si2 … Sik … Sit S*
aiai+1…an #
移入动作:设Sit的ai输入边所指向的状态为S*
归约动作:设按A→Xk+1Xk+2…Xt进行归约,则首先归约为A
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)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。
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的投影。
(aA,cde)
(aAc,de) (aAcd,e) (aAcB,e) (aAcBe,-)
S aAcBe[1]
aAcd[4]e[1]
aAb[3]cd[4]e[1]
ab[2]b[3]cd[4先分析
一种shift-reduce分析方法 根据文法符号的优先关系确定句柄 文法符号的优先关系的确定
上NO。 从已构造的 LRSM 部分图选择被标为 NO 的任一状态 IS, 并做 [1] 对每个符号XVTVN,做下面动作: 1) 令ISj = CLOSURE( IS(X)),若非空。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 x 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 重复上一步骤,直至没有被标记为 NO 的状态节点为止。
优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。
例: Z bMb Z Ma Z M (L L Ma) M
L b ( a ) #
Z FIRST b LAST b
M a( aL)
L M( a )
M L
b
(
a
)
#
⊳
⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳
6 S1=S0a S3 S c abc•[1] a•bc[1] b ab•c[1] ab•d[2] 7 a•bd[2] S d abd•[2] a•d[3] S4 d ad•[3] S5 c S8 bec•[4] e be•c[4] be•d[5] S9 d bed•[5]
正则式到LRSM的转换例
LRSM的性质
形如A→•[P]的项目称为归约型项目 形如A→•[P]的项目称为移入型项目 移入-归约冲突 归约-归约冲突
LRSM不能直接用于LR分析 LRSM提供的信息:
(1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法
5.1 自底向上语法分析方法介绍