语法分析自下而上分析

合集下载

第5章 语法分析(2)自下而上分析

第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 )

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法

实验5---语法分析器(自下而上):LR(1)分析法一、实验目的构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

二、实验内容程序输入/输出示例(以下仅供参考):对下列文法,用LR(1)分析法对任意输入的符号串进行分析:(1)E->E+T(2)E->E—T(3)T->T*F(4)T->T/F(5)F-> (E)(6)F->i输出的格式如下:(1)LR(1)分析程序,编制人:姓名,学号,班级(2)输入一个以#结束的符号串(包括+—*/()i#):在此位置输入符号串(3)输出过程如下:3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。

同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照。

三、实验方法1.实验采用C++程序语言进行设计,文法写入程序中,用户可以自定义输入语句;2.实验开发工具为DEV C++。

四、实验步骤1.定义LR(1)分析法实验设计思想及算法①若ACTION[sm , ai] = s则将s移进状态栈,并把输入符号加入符号栈,则三元式变成为:(s0s1…sm s , #X1X2…Xm ai , ai+1…an#);②若ACTION[sm , ai] = rj则将第j个产生式A->β进行归约。

此时三元式变为(s0s1…sm-r s , #X1X2…Xm-rA , aiai+1…an#);③若ACTION[sm , ai]为“接收”,则三元式不再变化,变化过程终止,宣布分析成功;④若ACTION[sm , ai]为“报错”,则三元式的变化过程终止,报告错误。

2.定义语法构造的代码,与主代码分离,写为头文件LR.h。

3.编写主程序利用上文描述算法实现本实验要求。

五、实验结果1. 实验文法为程序既定的文法,写在头文件LR.h中,运行程序,用户可以自由输入测试语句。

第5章 语法分析——自下而上

第5章 语法分析——自下而上

B d
e
SaAcBeaAcdeaAbcdeabbcde SS→aAcBeB→d A→Ab A→b
每次归约的都是句型中的句柄。
22
算符优先分析法
LR分析法
23
1. LR分析法介绍
2. LR(0)分析表的构造
3. SLR分析表的构造
24
从左(Left,L)向右扫描输入串,构造一 个最右推导(Rightmost,R)的逆过程 进行规范归约(最左归约),每次归约 的都是真正的句柄; 对文法限制最少,是识别效率较强的方 法; 出错处理能力较强; 采用自动构造技术(构造LR分析表)
B
e
A
b
d
S → aAcBe A → Ab A→b B→d
b
分 析 树
输入串:abbcde
7
短语 直接短语 句柄
8
定义:设文法G的开始符号为S,是文法 *则称β是 的一个句型,若有SA且Aβ, + 相对于非终结符A的一个短语。 句型
短语是指句型中的某个部分,这部分可以由某 个非终结符推出。 可以利用语法树来找出句型中的所有短语。
查表 A[0,a]=s2,进栈 A[2,a]=s2,进栈 A[2,b]=s5,进栈 A[5,b]=r2,按第2条产生式归约 G[2,A]=3,进入状态3 A[3,b]=s4,进栈 A[4,#]=r1,归约 G[0,A]=1,进入状态1 A[1,#]=acc 31
对于一个文法,如果能够构造一张分析表, 使得它的每个入口均是唯一确定的,则我们 把这个文法称为LR文法。
33
前缀:字的任意首部。即移去符号尾
部零个或多于零个符号得到的一个符
号串。 例:abc的前缀有ε,a, ab, abc

程序设计语言与编译原理_自下而上的语法分析

程序设计语言与编译原理_自下而上的语法分析
程序设计语言与编译
第8章 自下而上的语法分析 第一节 引言
自下而上分析:从输入串出发,归约, 直至开始符 方法:采用栈,在移进的过程中,观察栈顶是否 形成某个产生式的一个候选
程序设计语言与编译
自下而上分析法(Bottom-up)
» 基本思想:
从输入串开始,逐步进行“归约”,直到文法的开 始符号。所谓归约,是指根据文法的产生式规则, 把产生式的右部替换成左部符号。
程序问设题计的语提言出与:编译
① 在构造语法树的过程中,何时归约? 当可归约串出现在栈顶时就进行归约。
② 如何知道在栈顶符号串中已经形成可归约串? 如何进行归约? 通过不同的自底向上的分析算法来解释,不同的
算法对可归约串的定义是不同的,但分析过程都有一 个共同的特点:边移进 边归约。
规范归约:使用句柄来定义可归约串。 算符优先:使用最左素短语来定义可归约串
E1
8个内部节点—— 8棵子树 句型η 有8个短语:
E2 + T3
i1*i2+i3是句型η 相对于E1的短语
T4
F5
i1*i2是句型η 相对于E2 ,T4的短语
i1是句型η 相对于T6 ,F8的短语 i2是句型η 相对于F7的短语
T6 * F7
i3
i3是句型η 相对于T3,F5的短语
步骤: 1 2 3 4 5 6 7 8 9 10 动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)
e
dBB
b
cccc
bAAAAAAA
aaaaaaaaaS
程序设计语言与编译
S
分析树
aA c
Be
A
bd
b
分析树和语法树不一定一致。 自下而上分析过程:边输入单词符号,边 归约。 核心问题:识别可归约串

第五章 语法分析(自上而下分析法)

第五章 语法分析(自上而下分析法)

解: 这里P=exp , α 1=+term , α 2=-term, β =term 改写: exp → term exp' , exp' → +term exp' | - term exp' | ε
(3)间接左递归的消除 例如文法G(S): S→Qc|c Q→Rb|b R→Sa|a
虽没有直接左递归,但S、Q、R都是左递归的
例:简单的表达式文法 exp → exp addop term | term 消除其左递归。 解:属于格式P → Pα | β 这里 P=exp , α =addop term , β =term 改写: exp → term exp' exp' → addop term exp' | ε
例 文法G(E): E→E+T | T T→T*F | F F→(E) | i 经消去直接左递归后变成: E→TE′ E′→+TE′ | ε T→FT′ T′→*FT′ | ε F→(E) | i 不变
例1 假定有文法G(S): (1) S→xAy (2) A→** | * 分析输入串x*y(记为α)。 ① 按文法的开始符号产生语法树的根节点S,根据规 则,S有三个子孙,于是此时的语法树如图所示; 并把指示器IP指向串α的第一个符号x x*y IP S x*y IP S x A y
把语法树的子节点从左至右对IP所指向的符号进行匹 配。第一符号匹配,于是,IP向后移动一个符号。
是递归下降分析法和预测分析法的基础
LL(1)分析法
构造不带回溯的自上而下分析算法 要消除文法的左递归性 克服回溯
1 左递归的消除
(1)简单直接左递归 直接消除见诸于产生式中的左递归:假定关于非 终结符P的规则为

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

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

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

编译原理 第五章 语法分析-自下而上分析

编译原理 第五章 语法分析-自下而上分析

5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d

语法分析自下而上分析

语法分析自下而上分析
同理,可构造计算LASTVT的算法。 使用每个非终结符P的FIRSTVT(P)和
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最左素短语满足以下条件的最左子串 Njaj… NiaiNi+1, aj-1 aj
aj aj+1 , … , ai-1 ai ai ai+1
也即:
aj-1
ai+1
Nj aj … … ai Ni+1
2 例6.5 i1 *( i2 + i3) #
∵# i1 * ( i2 + i3 ) # ∴i1,i2,i3是素短语;i1是最左素短语。
算法分析:
k:=1; S[k]:=‘#’; REPEAT
把下一个输入符号读进a中; IF S[k]∈VT THEN j:=k ELSE j:=k-1; WHILE S[j] a DO
BEGIN REPEAT
Q:=S[j]; IF S[j-1]∈VT THEN j:=j-1 ELSE j:=j-2 UNTIL S[j] Q 把S[j+1]…S[k]归约为某个N; k:=j+1; S[k]:=N; END OF WHILE;
i2->OPND
三 算符优先分析
1 算符优先文法
①定义一
如果一个文法的任何产生式右部都不含两 个相继(并列)的非终结符,即不含有如下形式 的产生式右部:
…QR… 则我们称该文法为算符文法。
②定义二
假定G是一个不含ε-产生式的算符文法。对于任 何一对终结符a、b,我们说:
a b, 当且仅当文法G中含有形如P->…ab… 或P->…aQb…的产生式;
FIRSTVT(P)的自动构造
过程INSERT:
PROCEDURE INSERT(P,a) IF NOT F[P,a] THEN BEGIN F[P,a] := TRUE; 把(P,a)下推进STACK栈 END;
主程序:
BEGIN FOR 每个非终结符P和终结符a DO F[P,a] := FALSE; FOR 每个形如P->a …或P->Qa…的产生式 DO
⑤这是因为,假定有个产生式候选式:
…aP…,那么对任何 b∈FIRSTVT(P),有a b;
…Pb…,那么对任何 a∈LASTVT(P),有a b;
因此,问题归结为:
①构造该二个集合的算法,对每一 VN的 FIRSTVT(P) 、LASTVT(P)
②使用每个VN的FIRSTVT(P) 、LASTVT(P),检 查每一个产生式,找出所有(a,b)的关 系,就完成了构造优先关系表。
E(1)θE(2) ;然后重新进入第3步;(其中, E(1) 、E(2)分 别为OPND栈的次栈顶和栈顶)
a
θ ……
#
E (2) E (1)

OPTR
OPND
=> E(3)
④若θ a,则
•若θ=‘(’,a=‘)’,则逐出OPTR栈顶的‘(’,放弃a中的‘ )’,
转第
1步;
•若θ=a=‘#’,分析成功结束;
2)存在性:
并非总能把表映射到优先函数。
例6.6 对于下述关系表就不存在优先函数 f 和 g :
g(x)
a
b
f(x)
a
b
不然,应有:
① f(a) = g(a)
② f(a) > g(b)
③ f(b) = g(a)
④ f(b) = g(b)
那么,f(a)>g(b)=f(b)=g(a)=f(a),矛盾。
使用优先函数的优缺点: 优:便于比较运算;节省存储空间。 缺:对不存在优先关系的两个终结符,由于与自然数相
对应,变成可比较。
优先函数的性质: 1)正确性:
优先函数掩盖了矩阵中出错元素对,若f(id)<g(id), 暗示id id,但id之间无优先关系,因此失去发现错误能 力,但并未严重到妨碍在可解地方使用优先函数。
规范归约:是关于句型α的一个最右推导的 逆过程,也称最左归约。
例6.2 文法G
E —> T | E +T T —> F | T * F F —> i |(E)
的一个句型 i1*i2+i3
短语: i1 ,i2 ,i3 , i1*i2 , i1*i2+i3
直接短语: i1 ,i2 ,i3
句柄: i1
3)唯一性: 存在一个优先函数,就有无数多对,加一常数,不等
式也成立。
构造优先函数的方法 (如果优先函数存在的话)
对每个a(包括#)∈VT,对应两个符号fa,ga。 把所建立的符号尽可能划分为许多组:
若a b,则fa和gb就在一组; 若a b,c b,则fa和fc同组; 建立一个有向图,其结点是上一步中找出的组。 对于任何a和b,若 a b,画 fa→gb 弧,意味着f(a)>g(b);
(如:(E),则( ))
a b, 当且仅当G中含有形如P->…aR…的产生 式,而R b… 或 R Qb…;
a b, 当且仅当G中含有形如P->…Rb…的产生 式,而R …a 或 R …aQ。
③定义三 如果一个算符文法G中的任何终结符对(a,b)
至多只满足下述三种关系之一: a b,a b,a b
IF S[j] a OR S[j] a THEN BEGIN k:=k+1;S[k]:=a END
ELSE ERROR
UNTIL a=‘#’
7 优先函数
定义: 我们把每个终结符θ与两个自然数f(θ) 和g(θ)相对
应,使得:
若θ1 θ2,则f(θ1)<g(θ2) 若θ1 θ2,则f(θ1)=g(θ2) 若θ1 θ2,则f(θ1)>g(θ2) 函数 f 称为入栈优先函数,g 称为比较优先函数。
2 、自下而上分析法的基本思想:
自左向右逐个扫描输入串,一边把输入符号移入分 析栈内,一边检查位于栈顶部的一串符号是否与某个产生 式的右部相同。
若相同,则执行“归约”; 若不相同,就继续向栈内移进输入符号,并继续进行 判断。 分析成功:上述过程一直重复到输入串结束,而栈内恰好 为给定文法的开始符号为止。
主程序:
BEGIN FOR 每个非终结符P和终结符a DO L[P,a] := FALSE; FOR 每个形如P-> … a 或P-> … aQ的产生式 DO
INSERT(P,a); WHILE STACK 非空 DO
BEGIN 把STACK的顶项,记为(Q,a),弹出去 FOR 每条形如P-> … Q的产生式 DO INSERT(P,a)
E
E
+
T
T
F
T*F
ii3
F
ii
2
ii1
语法树
3 符号栈的使用
规范归约用来作语法分析需要解决的问题: ①如何在句型中找出句柄? ②在相同的右部有不止一个产生式时,选哪一个?
①实现移进-归约分析的一个方便途径是用一个栈和一个输 入缓冲区,用#表示栈底和输入的结束

输入
#
w#
② 分析程序的动作
移进: 下一输入符号移进栈顶 归约: 把句柄按产生式的右部进行归约 接收: 分析程序报告成功 出错: 发现了一个语法错,调用出错处理程序
3 构造集合FIRSTVT(P)的算法
① P->a…或P->Qa…,则a∈FIRSTVT(P); ②若a∈FIRSTVT(Q),且有产生式P->Q…,则 a∈FIRSTVT(P)
4 构造集合LASTSTVT(P)的算法
① P->…a 或 P->…aQ,则a∈LASTVT(P); ②若a∈LASTVT(Q),且有产生式P->…Q,则 a∈LASTVT(P)
第六、七章 语法分析——自下而上分析
本章内容 自下而上分析基本问题 直观算符优先分析法 算符优先分析 LR分析法
自下而上分析法 从输入串开始,逐步进行“归约”,直至
归约到文法的开始符号;
一、自下而上分析基本问题
1 、归约 利用栈,输入符号移进栈,当栈顶形成P的
候选式时,就归约为它的左P符号
5 构造优先表方法
① 对形如 P->…ab…和形如P->…aQb…,有a b; ②对形如 P->…aR…,而b∈FIRSTVT(R),有a b; ③对形如 P->…Rb…,而a∈LASTVT(R),有a b; ④对文法开始符号S,有# FIRSTVT(S),LASTVT(S) #,
且对 #S#,有# #。
⑤若θ a,a—>OPTR栈,转第1步;
⑥θ与a不存在优先关系,则输入串错误,调出错处理
成功!
#)
a
θ
(
……
#
E (2) E (1)

OPTR
OPND
2 例6.4 由文法G: E —> E + E | E * E | E↑E | ( E ) | i
的终结符的优先关系表及上述分析算法
分析算术表达式 i1 + i2 * i3 # 的过程。
注意: 可归约的串在栈顶,不会在内部
二 直观算符优先分析法
1 定义:
任二个相继出现的终结符a与b(可能中间有VN),可能有以 下优先关系:
ab
a的优先性低于b
ab
a的优先性等于b
ab
a的优先性高于b
2 例6.3 文法G:
E —> E + E | E * E | E↑E | ( E ) | i 的终结符的优先关系见下表。
E—> E+E | E*E | E↑E |( E )| i
优先表
+* ↑
i(
)#
+ * ↑ i (

#
3 使用如上分析表,构造分析算法(直观算符 优先分析法)
记号使用说明: #:语句括号(栈底 w后)
θ:现行栈顶符 a:刚读入字符 OPTR:运算符栈 OPND:操作符栈
相关文档
最新文档