第五章语法自底向上方法介绍
第5章 语法分析(2)自下而上分析

则成功,达不到这种格局则输入串有错误。
栈中符号串+剩余输入串 = 规范句型。
26
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行归约; 3. 重复2 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为合法的 句子,否则为非法句子.
2
5.1 自下而上分析的基本问题
自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。
各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
3
5.1 自下而上分析的基本问题
自下而上分析的基本技术是采用归约栈,如下图所示: #
或者说从文法的开始符号产生句子。
自下而上分析采用的方法是归约,从叶子到根构造分析树。
或者说从句子开始归约出文法的开始符号。
语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )
编译原理_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 讲 自底向上优先分析法

最左素短语
只规定算符(终结符)之间的优先关系。找到句 只规定算符(终结符)之间的优先关系。找到句 就归约,并不考虑规约到哪个非终结符名, 柄就归约,并不考虑规约到哪个非终结符名,不 是规范归约。 是规范归约。
简单优先分析法
按照文法符号(包括终结符和非终结符) 按照文法符号(包括终结符和非终结符) 的优先关系确定句柄。 的优先关系确定句柄。
动作
#<i,移进 移进 #<i>+,规约 规约 #<+,移进 移进 +<i,移进 移进 +<i>*,规约 规约 +<*,移进 移进 *<i,移进 移进 *<i>#,规约 规约 +<*>#,规约 规约 #<+>#,规约 规约 接受
+ + > - > * > / > ↑ > ( < ) > i > # <
算符优先关系表
算符文法的定义
定义 如果不含空产生式的上下文无关文法 G 中没 VW…的产生式 则称G 有形如 U→…VW 的产生式,其中V,W∈VN则称G 为 VW 的产生式,其中V,W 算符文法(OG)。 算符文法(OG)。 性质1 性质1:在算符文法中任何句型都不包含两个相邻的非 终结符.(数学归纳法) .(数学归纳法 终结符.(数学归纳法) 性质2 性质2:如 Vx 或 xV 出现在算符文法的句型 α 中, 其中V 其中V∈VN,x∈VT, 则 α 中任何含 x 的短语必含有 V.(反证法) V.(反证法) 注:证明的具体步骤见书P100 证明的具体步骤见书P100
1.
2.
将输入符号串a 将输入符号串a1a2a3...an#依次逐个存入符 号栈S 直到遇到栈顶符号a 的优先性> 号栈S中,直到遇到栈顶符号ai的优先性> 下一个待输入符号a 时为止。 下一个待输入符号aj时为止。 栈顶当前符号a 为句柄尾, 栈顶当前符号ai为句柄尾,由此向左在栈 中找句柄的头符号a 即找到a 为止。 中找句柄的头符号ak,即找到ak-1<ak为止。
自底向上的语法分析解读

程序4-4 简单优先分析驱动程序
int parser(void){ int i=0,k=0,r;stack[0]='#'; r=a[k++]; do{ int j,LeftSide; while(!IsHigherThan(stack[i],r)) {stack[++i]=r;r=a[k++];} j=i; while(! IsLowerThan (stack[j-1], stack[j])) j--; LeftSide= RightSideOfAProduction (stack[j],stack[i],i-j+1); if(LeftSide){ /*LeftSide!=0 means the production exists */ i=j;stack[i]=LeftSide; }else /* There is no production which matches the right side */ if(i==2 && r=='#' && stack[i] == STARTSYSBOL) return SUCCESS; else return ERROR; } while (1); } /* end of parser */
与的句柄之间的关系必有下述情况之一: A A
A
… … s t ... … … s t … ... … … s t … ... 1. s在句柄中, 3. s不在句柄中,而t 2. s与t均在句 而t不在句柄中 在句柄中 柄中 对于上述情况,我们规定, 情况1: s>t; 情况2: s=t; 情况3: s<t 另外,还有一种情况,就是s和t均不在句柄中,那么一定存在某句 型使得它们进入上述三种情况之一.
编译原理-清华大学-第5章-自底向上优先分析法(2+1)

第六章自底向上优先分析方法•教学要求:了解简单优先分折法,掌握算符优先分析法的关系表的构造以及分析过程。
•教学重点:算符优先表构造及算符优先分析法。
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 bbcde b cde de deabbcde eB cA a SB 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分析法7b db ac eSA B A d b a c e S A B A d a c eSA B a c e A B S 没有语法树如何确定句柄?86.1 自底向上优先分析法概述•基本思想:利用文法符号中相邻符号之间的优先关系(谁先规约的优先关系)找出句柄。
第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为文法的非终结符号。
语法分析自下而上分析

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 /*调用出错诊察程序*/
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
形如A→•[P]的项目称为归约型项目 形如A→•[P]的项目称为移入型项目 移入-归约冲突 归约-归约冲突
LRSM不能直接用于LR分析 LRSM提供的信息:
(1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息
例:构造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
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)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
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的性质
简单优先分析中的三种关系
Y :当且仅当存在一个产生式A→…XY… X ⊲ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 X ⊳ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。
X 文法G为简单优先文法如果满足:
对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
[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]
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的投影。
•两种分析方法 简单优先和LR类分析方法
例:S aAcBe [1] Ab [2] A Ab [3] Bd [4] 输入流:abbcde。 规范推导过程为:
逆过程:(符号栈,输入流)
( -, abbcde)
(a,bbcde) (ab,bcde) (aA,bcde) (aAb,cde)
优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。
例: 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
)
#
⊳
⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳
线性正则式状态机-LRSM
线性正则式:不含*符号的正则表达式
LRSM:(Linear Regular States Machine) (1)从LRSM可构造出恰好接受给定所有正 则式的确定自动机DA; (2)从LRSM的终止状态可判定接受的是哪 个正则式; (3)从LRSM的状态可判定一个正则式是不 是另一正则式的前缀。
IS = {abd[1],abc[2],bc[3],de[4],
dec[5]},
则有 : IS(a) = { abd[1], abc[2] } IS(b) = { bc[3] } IS(c) = { dec[4] }
线性正则式到LRSM的构造
给定正则式集{1,2,…n}: ■构造初始项目集 IS0={1[1],...,n[n]},并给 IS0 标上NO(表示未处理)。 ■从已构造的 LRSM 部分图选择被标为 NO 的任一项目集 ISi,并做下面动作:
⊳
⊲
⊲
定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 Xi+2 … Xj-1 Xj ⊳Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ⊲用来确定句柄的头; 用来确定句柄 的内部; ⊳用来确定句柄的结束。
简单优先分析算法要点
活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法
5.1 自底向上语法分析方法介绍
•基本思想 从待分析的符号串开始,自左向右进行 扫描,自下而上进行分析,通过反复查找当前句型 的句柄,并使用产生式规则将找到的句柄归约为相 应产生式的左部非终极符,直到将输入串归约为文 法的开始符。(移入-归约分析)
设当前格局是:
# 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
文法优先关系的确定
FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}
若有U…SiSj…: 则有Si Sj ; 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, SFIRST(Z),有# ⊲ S,; 且# ⊲ Z SLAST(Z),有S ⊳ #,; 且Z ⊳ #
# 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
展望符:Lookup(S) 有效前缀集 Prefix(S) 状态Si中的项目•[P]表示部分已被输 入,而且是Si的前缀的后缀,表示待输 入部分。 可构造接受给定正则式集合的DA 严格前缀:某状态中既含有定位点在尾处 的项目又含有定位点不在尾处的项目,则 一个正则式是另一个正则式的严格前缀。
找第一个使Sj⊳Sj+1的Sj。 从Sj开始往前(左)找第一个使Si-1⊲Si的Si。
用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。
简单优先分析实例
符号栈 # 关系 输入流 b(aa)b#
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
上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 的状态节点为止。