第五章自下而上语法分析
第五章语法分析—自下而上分析
输入串为i1*i2+i3 ,分析步骤为:
步骤 0 1 2 3 4
符号栈 # #i1 #F #T #T*
输入串 i1*i2+i3#
*i2+i3# *i2+i3# *i2+i3#
i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
设Q代表OPTR栈顶的当前符号,a代表新的输入符号, 则直观算符优先算法为:
1.Read next symbol to a; 2.If a=i then push a into OPND,GOTO 1; 3.If Q ·> a then Call E(1)QE(2);GOTO 3;
(注:E(1)QE(2)指pop E(1);pop E(2); t:=E(1),&,E(2)进行Q运算;push t;pop Q);
第五章 语法分析—自下而上分析
主要内容:
第五章 语法分析-自下而上分析
5.1 自下而上分析基本问题
5.2 算符优先分析
5.3 LR分析概述
5.4 LR(0)分析
5.5 SLR(1)分析
5.6 LR(1)分析
5.7 LALR (1)分析
5.8 二义文法的应用
2019/10/17
先乘除后加减,同级从左到右
考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E) 它的句子有几种不同的规范规约。
归约即计算表达式的值。归约顺序不同, 则计算的顺序也不同,结果也不一样。
如果规定算符的优先次序,并按这种规定 进行归约,则归约过程是唯一的。
第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 )
编译原理 - 自下而上的语法分析
*
S A
且
A
则称是句型相对于非终结符A的短语。 特别是,如果有A,则称是句型
相对于规则A的直接短语 一个句型的最左直接短语称为该句型
的句柄
5.1.7 规范归约例一
▪ 例:文法G[E]:
E→E+T|T
T→T*F|F F→(E)|–F|id
考虑文法G[E]上的句子id1+id2*id3 ➢ 其最右推导和分析树如图5.1(a)、(b)所示
第五章 语法分析—自下而上分析
内容
▪ 自下而上分析基本问题 ▪ 算符优先分析
5.1 自下而上分析基本问题
▪ 自下而上分析基本问题
➢ 归约 ➢ 规范归约 ➢ 符号栈的使用 ➢ 语法树的表示
▪ 算符优先分析
5.1.1 自下而上分析
▪ 自下而上分析
abbcde aAbcde (A b)
➢ 从输入字符的角度而言 aAcde (A Ab)
➢ 最左归约
规范推导
▪ 由规范推导推出的句型称为规范句型。
▪ 规范归约的中心问题:确定句型的句柄。
5.1.2 规范归约简述
▪ 最右推导,推导的每一步结果都是一个右句 型。该推导即分析树 “剪句柄”的全过程。
S
S
S
S
S
a A B ea A B ea A B ea A B e
Ab c d
Ab c d
d
图5.1 id1+id2*id3的最右推导、分析树与短语 (a) 最右推导;(b) 分析树;(c) 短语
5.1.7.1 归约的分析树
▪ 分析树的叶子与短语、直接短语和句柄有下述关系 ➢ 短语 以非终结符为根的子树中所有从左到右排列的 叶子 ➢ 直接短语 只有父子关系的树中所有从左到右排列的叶子 树高为2 ➢ 句柄 最左边父子关系树中所有从左到右排列的叶子 句柄是唯一的
第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
第五章 语法分析(自上而下分析法)
解: 这里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的规则为
自上而下语法分析
<语句>::=<标识符>:=<表达式> |<复合语句> |if <条件表达式>then<语句>[else<语句>] |while<条件表达式>do<语句> |read(<标识符表>) |write(<标识符表>)
5.2
8、构造算符优先分析表 : (1)拓广文法,增加产生式S’→#S#; (2) 计算每个非终结符的firstvt和lastvt; (3) 列表。
二、算符优先分析的若干问题
左符 右符 + * ( ) i
+
*
(
≡
)
函数说明>}
<常量定义>::=const<标识符>=<无符号数>{(,|;) <标
识符>=<无符号数>}
<变量说明>::=var<标识符>:integer{;<标识符表>:integer} <函数说明>::= function<标识符>[(<标识符表>
:integer)] :integer;<分程序>
5.2 算符优先分析法
一、算符优先文法及优先表的构造 二、算符优先分析的若干问题 三、优先函数
5.2 算符优先分析法
编译原理:第五章-语法分析——自下而上分析
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
编译原理第三版 第五章 自下而上语法分析
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理 第五章 语法分析-自下而上分析
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
语法之自下而上分析
5
#aAb
cde#
即输入符号串已经归约为:#aAbcde#,根据上述算法, 下一步Ab和b都可以归约(它们都在符号栈的栈顶且有 产生式AAb和Ab)。假若判b为句柄,则可把b归约 为A,即符号串归约为:#aAAcde#。那么,后面的工 作无论怎样做,都无法归约成功。
例2,设有文法G[E]:
F
+ * ( ) i STACK EFT , ii
EE+T |T TT*F | F
F(E) | i
E 10 01 10 0 01 T 0 01 10 0 10 F 0 0 10 0 10
TE ,, ** E,+ TFE,,((
①数组元素初始化为FALSE(用0表示FF)II;RRSSTTVVTT((ET))=={{+*,,*(,,(i,} i} ② F[U从,b文]=法T中RU找E出(用形1表如示U);b…E或EU+TVFbI的R产TST生VT式*TF,(F并)=使F{对(,应(iE}的) 数F组元i 素
自下而上分析 采用最左归约即规范归约。
5.1 自底向上分析的一般过程
一、一般过程:
一般的自底向上分析法,也称为“ 移进—归约”法,其一 般过程为: (1)设置一个存放符号的栈称为符号栈,用于记录分析的过程和确 定下一步的动作。
(2)把输入符号按扫描顺序逐个移进栈里(符号栈),当栈顶的符号 组成的符号串形成一个句柄时(正好是某条产生式的右部),就进 行归约。即把该符号串用与它对应的产生式左部的非终结符号代 替,仍然置于栈顶。
a的优先级高于b 记为: a .> b a的优先级等于b 记为: a . b a的优先级低于b 记为: a<. b
第5章 自下而上的语法分析.ppt
结符
5.3 LR分析法的基本原理
㈧LR(0)项目集规范族(简称项目集规范 族)
识 别 一 个 文 法 活 前 缀 的 DFA 的 项 目 集 (状态)的全体
㈨活前缀识别工作原理 输入串acd
5.4项目集规范族的构造
㈠文法拓广 引进产生式S'→S ㈡项目集I 的闭包(CLOSURE(I))P132 ㈢状态转换函数(GO(I,X)) P132 ㈣项目集规范族构造算法 C={I0};//项目集的集合 If (GO(Ii,XK) <>{} && GO(Ii,XK) !∈ C) { j++; Ij= GO(Ii,XK) ;C=C ∪ Ij};
②构造分析表(过程,手工完成)
5.5 LR(0)分析表的构造
总结 若文法的项目集规范族中的每个项目集不存在
以下情况: 1.既含有移进项目又含有归约项目 2.含有多个归约项目 则称该文法是一个LR(0)文法 即LR(0)文法的项目集规范族的任何一个项目
集都不包含冲突项目,仅当一个文法是LR(0) 文法时,才能构造出不含冲突的LR(0)分析 表
5.3 LR分析法的基本原理
对于文法G,可以构造一个有限自动机 DFA,用它去识别给定文法的所有规范 句型的活前缀,然后把这个DFA转换成 LR分析表。
因此,首先构造一个识别文法G所有活 前缀的NFA,这个NFA的每个状态是下 面定义的一个“项目”
5.3 LR分析法的基本原理
㈣LR(0)项目(简称项目) 文法G的LR(0)项目定义为: 在文法G每个产生式右部的某个位置添
④规范归约(最左归约) ⑤规范句型 ⑥规范推导 ⑦图解法
编译原理第五章语法分析——自下而上分析
第五章语法分析——自下而上分析要紧内容:[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所示。
第五章 语法分析 自下而上 4.0
A
b
d
aAbcde
S A c
aAcBe
B
e
a
B
e
d
3 符号栈的使用
规范归约用来作语法分析需要解决的问题: ①如何在句型中找出句柄?
②在相同的右部有不止一个产生式时,选哪一个?
①实现移进-归约分析的一个方便途径是用一个栈和一个输 入缓冲区,用#表示栈底和输入的结束
栈 # 输 入 w#
② 分析程序的动作
第五章 语法分析——自下而上分析
本章内容
自下而上分析基本问题
直观算符优先分析法
算符优先分析
LR分析法
语法分析
核心问题:句型分析 对任意上下文无关文法G = (V ,T ,P,S )
和任意w T *,是否有w L(G)? 若成立,
则给出分析树或(最左)推导步骤;否则,
进行报错处理。
记号使用说明:
#:语句括号(栈底 w后) θ:现行栈顶符 a:刚读入字符 OPTR:运算符栈 OPND:操作符栈
分析算法步骤: ①下一个输入符号读至a中; ②若a为i,则a—>OPND,转第一步; ③若θ 表达式 : a,则调用关于θ的处理程序(语义程序),处理子
E(1)θE(2) ;然后重新进入第3步;(其中, E(1) 、E(2)分 别为OPND栈的次栈顶和栈顶)
自底向上分析中的非确定性??
在每一步归约中,选择哪一个产生式以及匹配
哪一个位臵上的子串都可能是非确定的
这些非确定性导致分析过程会有很高的复杂性
改进的方法??
选择‚可归约串‛进行归约 在实用的自底向上分析中,总是选择某个‚可 归约串‛进行归约,可大大减少回溯
观 察
a θ …… E ( 2) E ( 1) … OPND
5第五章 语法分析--自下而上分析
句柄?子树?
a
A
A
b
c
B
d
e
(2)
a
A
A
b
c
B
d
e
b
S a A c B e a (4) A
(3)
S
c B e
(1) S
d
最右推导的逆过程
S A A a b b c B d e S a A A b c B d e abbcde aAbcde aAcde
aAcBe
S
A b AAb Bd SaAcBe
例:分析符号串 abbcde 是否为如下文法 的句子。
1) 2) 3) 4) SaAcBe A b AAb Bd (文法5.1)
• 最右推导
S 1) aAcBe 4) aAcde 3) aAbcde 2) abbcde rm rm rm rm
最右推导的逆过程(剪句柄)
S S
句柄:E+E 产生式:EE+E 句柄:id 产生式:Eid
“移进-归约‛方法的实现
• 必须解决两个问题: 1. 确定右句型中将要归约的子串 2. 如果这个子串是多个产生式的右部,如何确定选择哪个产生式 • 使用一个寄存文法符号的栈和一个存放输入符号串的缓冲区。 – 分析开始时,先将符号#入栈,以示栈底; – 将#置入输入符号串之后,以示符号串的结束。 – 从左向右把输入串的符号一一移进符号栈,发现栈顶是一个可归约串时, 就把这个串用相应的归约符号代替,重复进行移进-归约过程,直至栈中为 “#S”,输入串为“#”,表示分析成功
语法分析概述
功能:根据文法规则,从源程序单词符号串中
识别出语法成分,并进行语法检查。
基本任务:识别符号串是否为某语法成分 两大类分析方法:
第5章 语法分析——自下而上分析
(1)EE+T|T (2)TT*F|F (3)FP↑F|P (4)P(E)|i
+ *↑i ( ) #
+ * ↑ i ( ) #
26
按定义,我们可得文法G终结符对的优先关系表,如下所示:
+ *↑i ( ) #
+ ⋗ ⋖ ⋖ ⋖⋖⋗ ⋗
* ⋗ ⋗ ⋖ ⋖⋖⋗ ⋗
↑⋗ ⋗ ⋖ ⋖⋖⋗ ⋗
i ⋗⋗⋗
⋗⋗
( ⋖ ⋖ ⋖ ⋖⋖≖
“可归约串”的不同定义,形成了不同的自下而上的分析方法。
例: “算符优先分析”中:“最左素短语”——“可归约串” “规范归约分析”中:“句柄”——“可归约串”
5
5.1 自下而上分析基本问题
3.自下而上分析的中心问题: 怎样判断栈顶的符号串的可归约性以及如何归约。
各种自下而上分析法的共同特点: 边输入单词符号(移进符号栈),边归约。
(2)Ab (3)AAb (4)Bd (1)SaAcBe
S
11
5.1 自下而上分析基本问题
2.规范归约
(1)定义:设α是文法G的一个句子,那么我们称序列αn, αn-1,…,α0 是α的一个规范归约,若此序列满足: ① αn=α; ② α0=S,S为文法开始符号; ③ 对任何i,0<i≤n,αi-1是经把αi的句柄替换为 相应产生式的左部符号而得到的。 规范归约是关于α的一个最右推导的逆过程。
P…ab…或P…aQb…的产生式;
(2) a⋖ b 当且仅当 G中含有形如 P…aR… 的产生式, 而R⇒b+…或R⇒ Q+b…; FIRSTVT(R)
(3) a⋗ b 当且仅当 G中含有形如 P…Rb…的产生式, 而R⇒ …+ a或R⇒ …+ aQ 。 LASTVT(R)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
号。
例:设文法G(S): (1) S aAcBe (2) A b (3) A Ab (4) B d
试对abbcde进行“移进-归约”分析。
e
BBd
abbbbcccdddeee
bcc
Ab
Saa
步骤: 1 2 3 4 5 6 7 8 9 10 动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)
E E+ i
E
-E EE* E i i ( E)
E+ E
i
i
E
E* E- E E+E i
i
i
返回
E ( E)
E+ E
i
i
句子i+i-i*(i+i)的归约过程是: (1) i+i-i*(i+i) (2) E+i-i*(i+i) (3) E+E-i*(i+i) (4) E-i*(i+i) (5) E-E*(i+i) (6) E-E*(E+i) (7) E-E*(E+E) (8) E-E*(E) (9) E-E*E (10) E-E (11) E
E
在一个句型对应的
E+ T
语法树中,以某非 终结符为根的两代
T
F
以上的子树的所有
T * F i3
末端结点从左到右 排列就是相对于该
F
i2
i1
非终结符的一个短 语,如果子树只有 两代,则该短语就
是直接短语。
可用句柄来对句子进行归约 句型 归约规则 abbcde (2) A b aAbcde (3) A Ab aAcde (4) B d aAcBe (1) S aAcBe S
LR分析法:规范归约
G(E): E i| E+E | E-E | E*E | E/E | (E)
i*i+i
E*i+i
E*E+i
E+i
E+E
E
E E+ E
E*E i
i
i
5.1.1 归约
采用“移进-归约”思想进行自下而上分析 。
基本思想:用一个寄存符号的先进后出栈, 把输入符号一个一个地移进到栈里,当栈顶 形成某个产生式的候选式时,即把栈顶的这
考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E)
它的句子有几种不同的规范规约。 归约即计算表达式的值。归约顺序不同,
则计算的顺序也不同,结果也不一样。 如果规定算符的优先次序,并按这种规定
进行归约,则归约过程是唯一的。
例如:句子i+i-i*(i+i)
定义:假定是文法G的一个句子,我们 称序列
n, n-1, ,0 是的一个规范归约,如果此序列满足:
1 n= 2 0为文法的开始符号,即0=S 3 对任何i,0 i n, i-1是从i经把句 柄替换成为相应产生式左部符号而得到 的。
把上例倒过来写,则得到: S aAcBe aAcde aAbcde abbcde
输入串为i1*i2+i3 ,分+T T F | T*F F (E) | i
步骤 符号栈 输入串
0
#
i1*i2+i3#
1
#i1 *i2+i3#
2
#F *i2+i3#
3
#T *i2+i3#
4
#T* i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
G(E):
e
dBB
b
cccc
bAAAAAAA
aaaaaaaaaS
S
a A c Be
A
bd
b 分析树和语法树不一定一致。 自下而上分析过程:边输入单词符号,边 归约。 核心问题:识别可归约串
5.1.2 规范归约
定义:令G是一个文法,S是文法的开始符 号,假定是文法G的一个句型,如果有
*
S A
且
A
则称是句型相对于非终结符A的短语。
E T | E+T T F | T*F F (E) | i
步骤 4 5 6 7 8 9
符号栈 #T* #T*i2 #T*F #T #E #E+
输入串 i2+i3# +i3# +i3# +i3# +i3# i3#
动作 进 进 归,用F→i 归,用T→T*F 归,用E→T 进
步骤 9 10 11 12 13 14
特别是,如果有A,则称是句型相对 于规则A 的直接短语。一个句型的最左 直接短语称为该句型的句柄。
考虑文法G(E): E T | E+T T F | T*F F (E) | i
和句型i1*i2+i3: E E+T E+F E+i3 T+i3
T*F+i3 T*i2+i3 F*i2+i3 i1*i2+i3 短语: i1,i2,i3, i1*i2, i1*i2+i3 直接短语: i1,i2,i3 句柄: i1
预测分析程序
优点:直观、简单和宜于手工实现。
语法分析的方法:
自下而上分析法(Bottom-up)
基本思想:从输入串开始,逐步进行“归约
”,直到文法的开始符号。即从树末端开始, 构造语法树。所谓归约,是指根据文法的产生 式规则,把产生式的右部替换成左部符号。
算符优先分析法:按照算符的优先关系和结合 性质进行语法分析。适合分析表达式。
显然这是一个最右推导。
规范归约是关于是一个最右推导的逆过程
最左归约
规范推导
由规范推导推出的句型称为规范句型。
S
a A c Be
A
bd
b S
S
a A c Be
Ab
d
S
a A c Bea A c Be d
5.1.3 符号栈的使用和分析树的表示
栈是语法分析的一种基本数据结构。’#’作 为栈底符号
考虑文法G(E): E T | E+T T F | T*F F (E) | i
第五章 语法分析——自下而上分析
自上而下分析法(Top-down) 自下而上分析法(Bottom-up)
语法分析的方法:
自下而上分析法(Bottom-up) 自上而下分析法(Top-down)
基本思想:它从文法的开始符号出发,反复
使用各种产生式,寻找"匹配"的推导。
递归下降分析法:对每一语法变量(非终结 符)构造一个相应的子程序,每个子程序识 别一定的语法单位,通过子程序间的信息反 馈和联合作用实现对输入串的识别。
G(E):
E T | E+T T F | T*F F (E) | i
符号栈 #E+ #E+i3 #E+F #E+T #E #E
输入串 i3# # # # # #
动作 进 进 归,用F→i 归,用T→F 归,用E→E+T 接受
5.2 算符优先分析
四则运算的优先规则:
先乘除后加减,同级从左到右