第五章自下而上语法分析

合集下载

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

第五章语法分析—自下而上分析
■ 例:考虑文法G(E):E T | E+T T F | T*F F (E) | i
输入串为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)自下而上分析

第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章 语法分析——自下而上

第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的规则为

自上而下语法分析

自上而下语法分析
<复合语句>::=begin<语句表>end <语句表>::=<语句>{;<语句>} <标识符表>::=<标识符>{,<标识符>}
<语句>::=<标识符>:=<表达式> |<复合语句> |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)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。

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

编译原理第三版 第五章 自下而上语法分析
3. 归 (2) 4. 进 b 5. 归 (3) 6. 进 c 7. 进 d 8. 归 (4) 9. 进 e 10. 归 (1)
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) #看作终结符号
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 算符优先分析
四则运算的优先规则:
先乘除后加减,同级从左到右
相关文档
最新文档