第六章自底向上语法分析

合集下载

自底向上分析

自底向上分析
于是: 4+8-6/2*3 运算过程和结果唯一。 13
例: G[E] E→E+E | E*E | (E) | i
Vt={+, *, (, ), i} 这是一个二义文法,要用算符优先法分析有该文法所确定的 语言句子。 如:i+i*i
(1) 先确定终结符之间的优先关系
优先关系的定义:
设 a, b 为可能相邻的终结符
23
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i
1、求每个非终结符号的FIRSTVT及LASTVT
FIRSTVT
LASTVT
E {+,*,(,i}
{+.*,),i}
T {*,(,i }
{*,),i}
F {(,i}
{),i}
2、求=关系:(=)
3、求<关系:+<FIRSTVT(T),*<FITSTVT(F),(<FIRSTVT(E) 4、求>关系: LASTVT(E)>+,LASTVT(T)>*,LASTVT(E)>)
i*i# *i# *i#
i# # # # #
优先关系 动作
#<i 移进
i>+ 规约
#<+ 移进
+<i 移进
i>* 规约
+<* 移进 *<i 移进 i># 规约 *># 规约
+># 规约 接受 16
6.3.2 算符优先文法的定义
(1)算符优先文法(OPG) (2)构造优先关系矩阵 (3)算符优先分析算法的设计
构造优先关系表:
b(右栈外) +

编译原理(清华)第六章自底向上优先分析

编译原理(清华)第六章自底向上优先分析

按公认的计算顺序规定优先级和结合性,得到优先关系如下:
×,/的优先级高,遵循左结合,得×>×, ×>/, />/, />×
+,-的优先级低,遵循左结合,得+>+, +>-, - >-, - >+ ‘(’, ‘)’规定括号的优先级大于括号外的运算符,小于括号内的 运算符,如…E + ( E + T )…,有 + < (,( < + 规定:‘#’<任何与它相邻的运算符,
… 说明: δ 为ε 或C ,a,b不在同一句柄中,a先归约, 所以a的优先级大于b
3. 算符优先文法 定义: 设有一不含ε产生式的算符文法G,如果对任意 两个终结符对a,b之间至多只有一种优先关系 成立,则称G是一个算符优先文法(Operater Precedence Grammar),即OPG文法。 说明: 两个终结符之间的优先关系是有序的,算符优 先文法允许a>b,b>a同时存在,而不允许有 a>b,a<b,a=b三种情况中的任两种同时存在。 例如:算符优先文法允许 + > ) ,) > +同时存 在,不允许 + > ) 和 + < ) 同时存在
例 文法:E→E+T|T T→T×F|F F→(E)|i 求各非终结符的FIRSTVT集
(a)若产生式A→a…,或A→Ba…,则a∈FIRSTVT(A);
(b)若有产生式A→B…,且a∈FIRSTVT(B),则a∈FIRSTVT(A)
初值 E T F {} {} {}
第一次 第二次 {+} {×} {+ ,× }

第6章 自底向上分析思想

第6章 自底向上分析思想

算符优先关系表
+ + * / ^ ( ) i # > > > > < > > > > < > > > > < > > > > < < > > > < < < < > =. > > < > > > > > >. >. * / ^ ( ) >. i < < < < < < >. >. =. # >. >. >. >. >.
6.3 算符优先分析法
算符优先分析法只考虑算符(广义为终 结符)之间的优先关系,例如: (1)E → E+E (2) E → E-E (3) E → I 对输入串i1+i2*i3的归约过程可表示如下:
表6.3 对输入串i1+i2*i3的归约过程
步骤 1 2 3 4 5 6 7 8 9 10 11 # #i1 #E #E+ #E+i2 #E+E #E+E* #E+E*i3 #E+E*E #E+E #E 栈S
算符优先文法的定义
定义3: 设G是一个不含ε产生式的算符文法,如 果对任意两个终结符对a,b之间,至多 只有=.、<.、.>三种关系的一种成立, 则称G是一个算符优先文法。(Operator
Precedence Grammar)即OPG文法。
6.3.3 算符优先关系表的构造
(1)由定义直接构造(通过算法实现) (2)由关系图法构造(手工构造)

自底向上的语法分析解读

自底向上的语法分析解读

程序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均不在句柄中,那么一定存在某句 型使得它们进入上述三种情况之一.

讲稿第6章 自底向上优先分析

讲稿第6章 自底向上优先分析

第6章自底向上优先分析(8学时,5分钟)自底向上分析也称移进——归约分析,实现思想是对输入符号串自左至右进行扫描,并将输入符逐个移入栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可归约串(该句柄或可归约串对应某产生式的右部),就用该产生式的左部非终结符代替相应右部的文法符号串,这称为一步归约。

重复这一过程直到归约到栈中只剩文法的开始符号时则为分析成功,也就是确认输入串是文法的句子。

自底向上分析的关键问题是如何确定可归约串以进行归约。

上述内容可归结为教学要求:掌握算符优先分析法的关系表的构造以及分析过程,了解简单优先分折法。

教学内容:6.1自底向上分析概述6.2自底向上优先分析法概述6.3简单优先分析法6.4算符优先分析法本章重点:优先关系表、算符优先分析算法、优先函数6.1 自底向上分析概述(15分钟)前面已经谈了自下而上分析的基本思想,就是自左而右地扫描输入——源程序单词符号串,并逐步进行自下而上的归约,直至归约到文法的开始符号;或者说,从树的末端开始,一步步向上归约,直至树根。

这种构造树的过程与我们通常的从根开始构造的方法刚好是一个逆过程,因此这种树又称为语法分析树。

(1)归约和语法分析树上述思想可用如下的一个例子来说明:例如文法G[S]: (1)S→aAcBe(2)A→b(3)A→Ab(4)B→d显然,abbcde是该文法的一个句子,于是可如右图构造其语法分析树。

该语法树的构造的确是一个“自左而右、自下而上”的过程,我们把这一类分析方法统称为“自下而上”的。

(2)移进-归约在计算机上模拟以上的语法分析树的构造过程,可借助于一个符号栈来实现:由此看来,自下而上分析法就是对栈的“移进-归约”法,更进一步的,也就是对句子的一个规范归约过程——何为规范归约呢?(回顾短语、句柄、推导、归约的知识)移进——归约过程实际上是自顶向下最右推导的逆过程。

相对于最右推导为规范推导,自左向右的归约称为规范归约。

第六章 自底向上优先分析法

第六章 自底向上优先分析法

练习:若有句型#abAbEcaEc#,则以下哪些可能是句柄() ab abA bAb bAbE ca caE aEc
定义6.2 设G是一个算符文法,a和b是任意两个终结符,A、 B、C是非终结符,算符优先关系=、<、>定义如下: · · · (1)a=b 当且仅当G中含有形如 A … ab …或 A … aBb … · 的产生式。 · (2)a<b 当且仅当G中含有形如 A …aB …的产生式,且 B + b… 或B + Cb… (3)a>b 当且仅当G中含有形如 A …Bb …和产生式,且 · B + …a 或B + …aC A A A …B b… … a B… …a δ b… P P δ b … … a δ
优先分析方法 简单优先分析方法 算符优分析方法 1、简单优先分析方法:对一个文法按一定原则求出该文 法所有符号即终结符和非终结符之间的优先关系,按 照这种关系确定归约过程中的句柄,它的归约过程实 际上是一种规范归约。 2、算符优先分析方法:只规定算符之间的优先关系,也 就是只考虑终结符之间的优先关系,由于算答优先分 析不考虑非终结符之间的优先关系,在归约过程中只 要找到句柄就归约,并不考虑归约到哪个非终结符名, 因而算符优先归约不是规范归约。
第六章 自底向上优先分析法
• 实现思想:对输入符号串自左向右进行扫描,并将输 入符逐个移入一个后进先出栈中,边移入边分析,一 旦栈顶符号串形成某个句型的句柄时,(该句柄对应 某产生式的右部),就用该产生式的左部非终结符代 替相应右部的文法符号串,这称为一步归约。重复这 一过程直到归约到栈中只剩文法的开始符号时则为分 析成功。 • 自底向上分析的移进—归约过程是自顶向下最右推导 的逆过程,也称为规范归约。

课程编译原理 课件第6章自底向上语法分析

课程编译原理 课件第6章自底向上语法分析

优先关系可用矩阵来表示,称这种矩 阵为优先关系矩阵 。
具体定义如下图:
M[si,sj]
当 Si Sj 当 Si Sj 当 Si Sj
空 否则
构造优先关系矩阵步骤:
* STEP1:对每个非终极符号 W求下面
两种集合
? ?
FIRST(W)={S|W?+ LAST(W)={S|W?+
S ? ,S? (Vn∪Vt)} ? S,S? (Vn∪Vt)}
6.3.1 直观算符优先分析法
? 自下而上分析算法 模型----移进归约 ? 算符优先分析不是规范归约
分析程序模型
输入串#
总控程序
输出
# 算符优先关系表 产生式
如何确定算符优先关系?
文法G[E] :E →E + E|E - E|E *E|E /E|E ? E|(E )|i
ZML b ( a ) Z M L b ( a )
所以对G[Z]: Z→bMb M→a|( L L→M a )
有:FRIST(M)={ (,a } LAST(M)={ ),L,a } 有下表:
Z FIRST b
LAST b
M (a
)La
L M(a
)
定义3.13 满足下面两个条件的文法称为 简单优先文法 。
第6章 自底向上语法分析
6.1 自底向上语法分析
一、自底向上方法概述 自底向上方法:从给定终极符串进行
归约,并归约成文法的初始符。
移进-归约方法的四个动作 : ? 移进:输入流头符读到分析栈中 ? 归约:分析栈句柄归约非终极符 ? 接受:分析成功 ? 报错:处理错误
例子:对输入串abbcde进行分析,检查该 串是否是G[S]的句子。

第六章 语法分析-自下而上分析法

第六章 语法分析-自下而上分析法

一、自下而上语法分析的基本问题 1.归约: 如何判断栈顶符号的可归约性以及如何归约,是 自下而上分析的中心问题。 2.短语和句柄
如果S ⇒ αAβ and A ⇒γ,则称γ是句型 αγβ的相对于变量A的短语 * 如果S ⇒αAβ and A⇒γ,则称γ是句型 αγβ的相对于变量A的直接(简单)短语 最左直接短语叫做句柄
e
abbcde
一、自下而上语法分析的基本问题 (3)自下而上分析的关键问题
似乎移进-归约过程很简单,其实不然,在上面第5步,如果用 规则2(P → b)进行归约而不是用规则3(P → Pb)进行归约,结果 会怎么样呢? 上面的归约过程是从文法的句子abbcde开始,每一步都是把最 左直接短语(句柄)替换为相应产生式的左部符号(在步骤5时 栈顶为#aPb,此时是将b归约为P还是将Pb归约为P?由于此时对 于句型aPbcde(即栈内容+输入缓冲区内容)来说Pb是句柄,故 将Pb归约为P)。也就是说,自底向上分析的关键问题是在分析 中如何确定句柄(准确地说为可归约串),即如果知道何时在 栈顶符号串中已形成了某句型的句柄,那么就可以确定何时进 行归约。对此,不同的分析方法有不同的解决办法。这里主要 介绍算符优先及LR分析方法。
例: 移进—归约分析(Shift-reduce parsing)
要点:建立符号栈,用来纪录分析的历史和现状, 并根据所面临的状态,确定下一步动作是移 进还是归约。
输入串 # 符号栈 #
S.R.P
输入串 # 符号栈 #
S.R.P
分析过程:把输入符号串按自左向右顺序一一地 移进符号栈(一次移一个),检查栈中符号,当在栈 顶的若干符号形成当前句型的句柄时,就根据规则进 行归约,将句柄从符号栈中弹出,并将相应的非终结 符号压入栈内(即规则的左部符号),然后再检查栈 内符号串是否形成新的句柄,若有就再进行归约,否 则移进符号。分析一直进行到读到输入串的右界符为 止。最后,若栈中仅含有左界符号和识别符号,则表 示分析成功,否则失败
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方法二:由关系图法构造
由定义构造优先关系表VT集合

FIRSTVT(B)={b| B b…或B Cb…} LASTVT(B)={a| B …a或B …aC}

计算优先关系:
a的优先性等于b的优先性 :A→…ab…或A→…aBb… a的优先性小于b的优先性:A→…aB…,且b∈ FIRSTVT(B) a的优先性大于b的优先性:A→…Bb…,且a∈ LASTVT(B)
如果根据一个文法的算符优先关系表,使得文法中 的每个终结符a和b满足下述条件:
(1) 如果存在a b, 则有f(a)=g(b);
(2) 如果存在a ⋗ b,则有f(a)>g(b);
(3) 如果存在a ⋖ b,则有f(a)<g(b)。 则称f和g为优先函数;其中,f称为入栈函数,g称为比较 函数。 一个终结符在栈中(左)与在输入串中(右)的优先值是不同
步骤 1 2 # #i 栈
F->F+F|i
动作 移进 归约 移进 移进 归约 归约 接受
优先关系
当前符号
i + + i # # #
剩余输入串
+i #
i# i#
3
4 5
#F
#F+ #F+i
#
6
7
#F+F
#F
算符优先分析不是规 范归约!
最左素短语:
图6.6
图6.7
算符优先分析结论:

算符优先文法在归约过程中只考虑终结符 之间的优先关系,由此来确定“句柄”, 而与非终结符无关。只需要知道把当前 “句柄”归约为某一非终结符,不必知道 该非终结符的名字是什么。
S→aAcBe A→b|Ab B→d
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进 归约(B→d) 移进 归约(S→aAcBed) 接受
步骤 1 2 3 4 5 6 …
符号栈 # #a #ab #aA #aAb #aA …
输入符号串 abbcde# bbcde# bcde# bcde# cde# cde#
算符优先分析思想:

首先找出所有(算符)终结符之间的优先 关系,然后根据优先关系对输入串进 行分析,找到“句柄”就归约,但并不 考虑归约到哪个非终结符名 因而不是规范规约
6.2 简单优先分析法


简单优先分析法是按照文法符号的优先 关系确定句柄的 文法符号包括终结符和非终结符
6.2.1 优先关系:
若ai⋖aj或ai aj,则画一条从gaj到fai的有向边;
③ 对每个结点都赋予一个数,此数等 于从该结点出发所能到达的结点(包括出 发结点自身在内)的个数,赋给fai 的数作 为f(ai)值,赋给gaj的数作为g(aj)值; ④ 检查所构造出来的函数f和g,看它 们同原来的优先关系表是否有矛盾。如果 没有矛盾,则f和g就是所要的优先函数; 如果有矛盾,那么就不存在优先函数。
6.3 算符优先分析法

按照运算符的优先顺序和结合性,确定 它们之间的优先关系。例如,乘法运算 比加法运算优先,于是有 ﹡ + 和 + ﹡ ;加法运算是左结合的, 所以 + +。
例如有文法: E->E+E E->E*E E->i 对输入串i1+i2*i3的归约过程如表6.3所示
有文法:
表6.3 对输入串i1+i2×i3的归约过程
优先关系:等于、小于、大于 优先关系表示如下: X Y: 表示X和Y 的优先关系相等 X Y: 表示X的优先性比Y 的优先性大 X Y: 表示X的优先性比Y 的优先性小
对已知文法中的任意两个文法符号X,Y按其在句型中可
能出现的相临关系来确定它们的优先关系:



X Y 当且仅当G中存在产生式规则 A…XY... X Y 当且仅当G中存在产生式规则 A…XB…,且 B Y… X Y 当且仅当G中存在产生式规则 A …BD… 且有B …X 和D Y…
第6章 自底向上优先分析法


基本知识点:自下而上语法分析的基本思想 和面临的问题,简单优先分析法,算符优先 分析法。 重点:算符优先关系矩阵的构造 难点:句型短语、句柄、最左素短语的寻找
自底向上优先分析法:



自底向上优先分析思想 简单优先分析法 算符优先分析法
自底向上分析思想:

任何时候栈中符号串和剩余符号串组成 一个句型,当句柄出现在栈顶符号串中 时,就用该句柄进行归约,这样一直归 约到输入串只剩结束符、栈中符号只剩 下开始符号,此时认为输入符号串是文 法的句子,否则报错。
⑴ E->E+E ⑵ E->E*E ⑶ E->i
动作 移进 归约(3) 移进 移进 归约(3) 移进 移进 归约(3) 归约(2) 归约(1) 接受
算符文法的定义(6.1定义)
若一文法G中没有形如A→…BC… (A、B、C∈VN)的产生式(即两个非 终极符相邻),则称G为算符文法,也 称OG文法。
#i #P #F #T #E #E+ #E+i #E+P #E+F #E+T #E
+i# +i# +i# +i# +i# i# # # # # #
移进 移进 归约P→i 归约F→P 归约T→F 归约E→E+T 接受
对应文法为:
观察表6.7的分析栈
# #i #P 分析栈
E->E+T|T T->T*F|F F->P↑F|P P->(E)|i
由语法树看优先性:
a的优先性等于b
a的优先性小于b
a的优先性大于b
算符优先文法的定义(定义6.3)
对于某一文法G满足: 是算符文法 不含产生式 任意a、b( a、b∈VT)之间的优先关系 最多只有一种 文法G是算符优先文法(OPG)。
构造算符优先关系表:

方法一:由定义直接构造

算符文法的性质:


在算符文法中任何句型都不包含两个相 邻的非终结符(性质1) 如果Ab(或bA)(A∈VN,b∈VT)出现 在算符文法的句型中,则中任何含b的 短语必含有A(性质2)
任意两终结符之间优先关系的定义(6.2):
设G是一个不含产生式的算符文法,a、b∈VT, A、B、C∈VN: a的优先性等于b的优先性是当G中含有 A→…ab…或A→…aBb… 产生式 a的优先性小于b的优先性当G中含有 A→…aB…,且B b…或B Cb… a的优先性大于b的优先性当G中含有 A→…Bb…,且B …a或B …aC
的。因此,对一个终结符a而言,它应该有一个左优先
数f(a)和一个右优先数g(a),这样就定义了终结符的一 对函数。
构造优先函数的方法:
有两种:一种是关系图法;另一种由定义直接构 造。 (1) 用关系图法构造优先函数的步骤如下: ① 对所有终结符a(包括“#”),用有下脚标的fa 、 ga 为结点名,画出全部n个终结符所对应的2n个 结点; ② 若ai⋗aj 或ai aj,则画一条从fai到gaj的有向边;
自下而上分析法是一种“移进—归约”法,这是因为 在自下而上分析过程采用了一个先进后出的分析栈。分析 开始后,把输入符号自左至右逐个移进分析栈,并且边移 入边分析,一旦栈顶的符号串形成某个句型的句柄时就进 行一次归约,即用相应产生式的左部非终结符替换当前句 柄。接下来继续查看栈顶是否形成新的句柄,若为句柄则 再进行归约;若栈顶不是句柄则继续向栈中移进后续输入 符号。不断重复这一过程,直到将整个输入串处理完毕。 若此时分析栈只剩有文法的开始符号则分析成功,即确认 输入串是文法的一个句子;否则,即认为分析失败。
优先分析法分为:

简单优先分析法 算符优先分析法
特点
考虑所有文法符号之间 的优先关系,且这种优 先关系唯一
优先关系分类:
文法类型 简单优先文法 分析法名称
简单优先分析法
算符优先文法
算符优先分析法
只考虑终结符之间的优 先关系,且这种优先关 系唯一
简单优先分析法思路:

先确定文法中所有文法符号之间的优先 关系,然后根据这种优先关系寻找句柄 进行归约 其规约过程是规范规约


“句柄”实际上是最左素短语。算符优先 分析的关键是寻找最左素短语。 确定最左素短语…
6.3.5 优先函数:
用优先关系表来表示每对终结符之间的优先关 系存储量大、查找费时。如果给每个终结符赋
一个值(即定义终结符的一个函数f),值的大小
反映其优先关系,则终结符对a、b之间的优先 关系就转换为两个优先函数f(a)与f(b)值的比较。 使用优先函数有两个明显的好处:一是节省空 间;二是便于进行比较运算。

构造关系表
例6.3文法 : ⑴E’→#E# ⑵E→E+T ⑶E→T ⑷T→T*F
⑸T→F ⑺P→(E) ⑻P→i
⑹F→P↑F|P
①求=关系:由⑴ ⑺式得:“#”= “#”,“(” =“)”
②求<关系:
③求>关系:
构造的优先关系矩阵如表6.5:
表达式文法算符优先关系表
由关系图法构造优先关系表

自底向上分析中的重要工作:


判断当前栈中符号串中哪些符号构成句 柄 归约:构成句柄就归约
文法G为:
例6.1 移进—归约对输入串abbcde#分析过程
步骤 1 2 3 4 5 6 7 8 9 10 11 符号栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S 输入符号串 abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
步骤 1 2 3 4 5 6 7 8 9 10 11 符号栈 # # i1 #E # E+ # E+ i2 # E+E # E+E × # E+E × i3 # E+E × E # E+E #E 当前输入符号 剩余输入串 i1 + + i2 × × i3 # # # # +i2×i3# i2×i3# i2×i3# ×i3# i3# i3# #
相关文档
最新文档