第六章自底向上语法分析

合集下载

自底向上分析

自底向上分析
于是: 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
分析过程:把输入符号串按自左向右顺序一一地 移进符号栈(一次移一个),检查栈中符号,当在栈 顶的若干符号形成当前句型的句柄时,就根据规则进 行归约,将句柄从符号栈中弹出,并将相应的非终结 符号压入栈内(即规则的左部符号),然后再检查栈 内符号串是否形成新的句柄,若有就再进行归约,否 则移进符号。分析一直进行到读到输入串的右界符为 止。最后,若栈中仅含有左界符号和识别符号,则表 示分析成功,否则失败

在自底向上的语法

在自底向上的语法

在自底向上的语法一、什么是自底向上的语法自底向上的语法(Bottom-Up Parsing)是一种常用的语法分析方法,用于将一个字符串根据给定语法规则转化为语法分析树。

与之相对的是自顶向下的语法分析方法,自顶向下的语法分析从根节点开始,逐步将输入的字符串分解为非终结符和终结符,直到得到语法分析树。

而自底向上的语法分析则相反,它从叶子节点开始,逐步合并成非终结符,直到得到语法分析树。

自底向上的语法分析方法通常采用的是操作符优先分析法(Operator Precedence Parsing),也称为算符优先文法。

这种分析方法可以通过构造一个算符优先关系表来进行分析,从而判断字符串是否符合给定的语法规则。

自底向上的语法分析方法适用于各种类型的语言和文法,包括正则文法、上下文无关文法等。

这种方法具有较高的灵活性和适应性,并且能够处理大型复杂的文法和语言。

二、自底向上的语法分析步骤自底向上的语法分析过程可以分为以下步骤:1. 词法分析首先,将输入的字符串进行词法分析,将其划分为一个个单词或记号(Token)。

每个单词或记号都具有一个特定的含义,表示了输入字符串中的一个基本语义单元。

2. 初始化构建一个栈(Stack)用于保存已识别的单词或记号,并初始化一个语法分析表(Parsing Table)用于记录语法规则和操作符的优先级关系。

3. 移入操作从输入的字符串中读取一个未处理的单词或记号,并将其压入栈中。

4. 归约操作不断检查栈中的记号序列是否满足某一语法规则,如果满足,则将该记号序列替换为相应的非终结符,并执行相应的语义动作。

重复这个过程,直到不能再进行归约操作。

5. 接受或错误处理如果最终栈中只剩下一个元素,且该元素为起始符号,则语法分析成功,接受输入的字符串。

如果栈中无法进行归约操作,或者最终栈中还有多余的元素,或者无法匹配到输入字符串的所有部分,则语法分析失败,进行错误处理。

三、算符优先文法算符优先文法是自底向上分析方法的代表,它以操作符的优先级和关联性为基础,构造一个优先关系表来进行分析。

编译原理第六章-自底向上优先分析法

编译原理第六章-自底向上优先分析法
38
(E’, #)
39
40
+*^ i ( )#
E’
1
E11111
T
1111
F
111
P
11
FIRSTVT(E’) = {#} FIRSTVT(E) = {+, *, ^, i,(} FIRSTVT(T) = {*, ^, i,(} FIRSTVT(F) = { ^, i,(} FIRSTVT(P) = { i,(}
13
6.3 算符优先分析法
某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别 和同一级别的结合性
只考虑算符之间的优先关系来确定句柄
14
6.3.1 直观算符优先分析法
文法G[E]:E→E+E|E-E|E*E|E/E|EE|(E)|i
(1) 优先级最高,右结合
24
(P, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
25
(F, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
26
(T, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
27
(E, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
S=>aAcBe=>aAcde=>aAbcde=>abbcde 由此我们可以构造它的逆过程即归约过程。
5
自底向上分析的关键问题: 如何确定句柄。
6
自底向上优先分析法慨述 简单优先分析 算符优先分析
7
6.2 简单优先分析法

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

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

第6章⾃底向上优先分析法⾃底向上分析⽅法,也称移进-归约分析法,粗略地说它的实现思想是对输⼊符号串⾃左向右进⾏扫描,并将输⼊符逐个移⼊⼀个后进先出栈中,边移⼊边分析,⼀旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产⽣式的右部),就⽤该产⽣式的左部⾮终结符代替相应右部的⽂法符号串,这称为归约。

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

本章将在介绍⾃底向上分析思想基础上,着重介绍算符优先分析法。

例6.1,设⽂法G[S]为:(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d对输⼊串abbcde#进⾏分析,检查该符号串是否是G[S]的句⼦。

由于⾃底向上分析的移进-归约过程是⾃顶向下最右推导的逆过程,⽽最右推导为规范推导,⾃左向右的归约过程也称为规范归约。

容易看出对输⼊串abbcde的最右推导为:S aAcBe aAcde aAbcde abbcde由此我们可以构造它的逆过程即归约过程。

先设⼀个后进先出的符号栈,并把句⼦左括号”#”号放⼊栈底。

对上述分析过程也可看成⾃底向上构造语法树的过程,每步归约都是构造⼀棵⼦树,最后当输⼊串结束时刚好构造出整个语法树。

在上述移进-归约或⾃底向上构造语法树的过程中,考虑⼏个问题:u 何时移进?u 何时归约?u 将哪个字符串归约?当⼀个⽂法⽆⼆义性时,那么它对⼀个句⼦的规范推导是唯⼀的,规范规约也必然是唯⼀的。

因⽽每次归约时要找当前句型的句柄,也就是说,任何时候栈中的符号串和剩余的输⼊串组成⼀个句型,当句柄出现在栈顶符号串中时,则可⽤句柄归约,这样⼀直归约到输⼊串只剩结束符,⽂法符号栈中只剩开始符号。

由此可见,⾃底向上分析的关键问题是在分析过程中如何确定句柄,即如何知道何时在栈顶符号串中已形成某句型的句柄。

然⽽⾃底向上的分析算法很多,我们仅在本章和第7章介绍⽬前常⽤的算符优先分析和LR类分析法。

6.1 ⾃底向上优先分析法概述优先分析法⼜可分简单优先法和算符优先分析法。

编译原理自底向上优先分析

编译原理自底向上优先分析

(E: 则有(<FIRSTVT(E)
(4)求>关系
E#: 则有LASTVT(E)>#
E+:则有LASTVT(E)>+
T*: 则有LASTVT(T)>*
P^:则有LASTVT(P)>^
E): 则有LASTVT(E)>)
23
(0)E’#E# (1) EE+T (2)ET
(3)TT*F
(4)TF (5)FP^F|P (6)P(E) (7)Pi
➢ 性质1:在算符文法中,任何句型都不包含两个 相邻的非终结符。
➢ 性质2:如果Ab或(bA)出现在算符文法的句型 中。其中,A为非终结符, b为终结符, 则句型中 任何含b的短语必含有A.
17
6.3.2 算符优先文法的定义
定义3 设有一个不含产生式的算符文法G,如果对任意两
个终结符对a、b之间至多只存在<、>、=三种关系中的
( (, ( a, ( A
(3)求 关系
由SbAb, A=>…), A=>…B, A=>a, 可得:
) b, a b, B b
由BAa), A=>…), A=>a, A=>…B,可得:
) a, a a, B a
8
增:S’#S#
例:文法G[S]:SbAb A(B|a BAa)
文法的简单优先关系矩阵
S b A(B a)#
B=+=>Y… (3)X Y:当且仅当存在规则A…BY…,且
B=+=>…X *
7
例:文法G[S]:SbAb A(B|a BAa)
分析优先关系:
(1)求 关系
b A, A b, ( B, A a, a )

《编译原理》第6章 (1)

《编译原理》第6章 (1)

…a
a >b
24
由定义直接构造:
预备知识:
定义两个集合:
+ + FIRSTVT(B)={b|B b…或B Cb…},
+ + LASTVT(B)={b|B …b或B …bC}
即最后一个终结符 即第一个终结符
25
三种优先关系的计算为: a)≡关系 条件:A…ab... A…aBb… b) <关系 条件:A…aB… bFIRSTVT(B) 结论:a<b c) >关系 条件:A…Bb… aLASTVT(B) 结论:a>b
20
定义:设G是不含产生式的算符文法,若G中任何两个终 结符号之间至多有一种优先关系存在,则G是一个算符 优先文法OPG。 注:不允许有ab、 a≡b、 ab 中的两种同时存在 要完成运算符间优先级的比较,最简单的办法是先定义 各种可能相继出现的运算符的优先级,并将其表示成矩 阵形式,即得到一个算符优先关系表。在分析过程中通 过查询矩阵元素而获得算符间的优先关系。
了解算符优先分析法的优缺点和实际应用中的局限性
2
【学习指南】
算符优先分析法是自下而上语法分析的一种,它的算
法简单、直观、易于理解,故通常作为学习其它自下 而上语法分析的基础。在学习前,应复习有关语法分 析的知识,如:什么是语言、文法、句子、句型、短 语、简单短语、句柄、最右推导、规范归约基本概念
S
A
A→Ab
最右推导 句型
abbcde
句柄 归约用规则 b A→b
S→aAcBe
aAbcde
Ab
d
A→Ab
B→d
A
A→b
B
B→d
aAcde

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

第6章自底向上优先分析法
第6章 自底向上优先分析法
6.1 概述
原理:在采用自左向右扫描,自底向上分析的前提下,该类 分析方法是从输入符号串入手,通过反复查找当前句 型的句柄(最左简单短语),并使用文法的产生式把 句柄归约成相应的非终结符来一步步地进行分析的。 最终把输入串归约成文法的开始符号,表明分析成功。 所以,任何自底向上分析方法的关键就是要找出当前 句型的句柄,然后根据产生式判别将它归约成什么样的非 终结符号。
解:归约过程见分析过程串为E+E,若只从移进-归 约的角度讲,栈顶已出现了产生式(1)的右部,可以进行归约, 但从通常四则运算的习惯来看应先乘后加,所以应移进,这就 提出了算符优先的问题。
例6.5:下面给出一个表达式的文法为: E→E+E|E-E|E*E|E/E|E↑E|(E)|i
(
a )
. <
=
. < . <
. >
. >
. >
. >
=
.
Z bM b
( L Ma )
构造优先矩阵的一种简便方法:
STEP 1 对每个非终极符W求下面两种集合: + HEAD(W)= {S︱W S…,S∈(VNUVT)} + LAST(W)={S︱W …S,S∈(VNUVT)} STEP 2 对每个符号对Si,Sj填写优先关系矩阵元素(其中W,V∈VN): M[Si,Sj]= ﹒ = ,如果有U→ … SiSj …
这种方法的基本思想为: 首先规定文法符号之间的优先关系,然后再利用这种关系, 通过比较句型中两个相邻的符号之间的优先关系来确定句型的 “句柄”并进行归约。
二、相邻关系:
设Si和Sj是文法G的任意两个符号,那么它们在句型中可相 邻出现的充要条件是必须满足下列条件之一:
  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# #
相关文档
最新文档