第4章自底向上分析法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
b.如果Ab或bA出现在算符文法的句型r中,其中A ∈VN,b ∈VT,则r中任何含b的短语必含有A。
E E+ T E + TT × F
句型E+T+T×F 短语有: E+T
T×F E+T+T×F
4.4.2 算符优先文法的定义
2. G是算符文法,a,b∈VT ,A,B,C∈VN,算符 优先关系定义如下:
B
b
T→T×F|F
…
F→(E)|i
P
由E→E+T
E=>+ T×F
aδ …
得×>. +
说明: δ为ε或C ,a,b不在同一句柄中,a先归约,
所以a的优先级大于b
例:考虑下面的文法G(E):
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
例 文法:E→E+T|T T→T×F|F
的一个句型为 T+T×F+i
短语为:T,T×F,i,
T+T×F,
T+T×F+i
E
素短语为:T×F,i T
最左素短语为:T×F
F→(E)|i
E
E
+T
+T
F
T ×F i
规范归约每次归约当前句型中的句柄 算符优先分析每次归约当前句型的最左素短语。
4.4.4 算符优先分析算法
4.3 自下而上分析法的一般原理
2 基本实现方法 ➢ 设一个先进后出的符号栈,并将符号串边界符$移
入栈中. ➢ 分析时,对输入符号串自左向右进行扫描,并把
当前输入符号下压入栈中。 ➢ 边移进边分析,一旦栈顶符号串形成某个句型的
句柄(为某产生式的右部)时,就用相应的非终 结符(产生式的左部)替换它。 ➢ 重复这一过程,直到输入符号串的末端,此时如 果栈中只剩$和文法开始符号,则输入符号串是 文法的句子,否则不是。
依次考察每个产生式的右部:
ห้องสมุดไป่ตู้
+ ×( ) i $
由E+和LASTVT(E)={+,×,),i} 得到:+>+,×>+,)>+,i>+
由+T和FIRSTVT(T)={×,(,i} 得到:+<×,+<(,+<i
+><< < ×> ( )> i>
$
例 文法 E→E+T|T
T→T×F|F F→(E)|i
由T×和LASTVT(T)={×,),i} 得到: ×>×,)>×,i>×
➢ 何时移进?栈顶未形成可归约串 ➢ 何时归约?栈顶形成可归约串
常用自下向上分析法(根据可归约串识别方法的 不同):
算符优先分析法(根据优先关系确定栈顶是否可归约)
LR分析法(根据历史、现实、展望确定栈顶是否形成句 柄)
4.4 算符优先分析法
4.4.1 方法概述 4.4.2 算符优先文法的定义 4.4.3 算符优先关系表的构造 4.4.4 算符优先分析算法 4.4.5 优先函数 4.4.6 算符优先分析法的局限性
6) $aA
cde$
移进
7) $aAc
de$
移进
8) $ aAcd
e$
归约(B→d)
9) $aAcB
e$
10) $aAcBe
$
11) $S
$
移进 归约(S→aAcBe) 接受
对输入串abbcde$的移进-规约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子
S aAcBe aAcde aAbcde abbcde
4.4.1 方法概述
如:E+T×i,+和×相邻,×和i相邻, 但+和i不相邻
3.终结符间优先关系类型 终结符a和b之间的优先关系表示如下: a<.b 表示a的优先级低于b a=. b 表示a的优先级等于b a>. b 表示a的优先级高于b
注意:<.,=. ,.>是三种有序关系,与数学中的<, =,>不同,所以a=. b不意味b=. a,a>. b不意味 b<. a
由×F和FIRSTVT(F)={(,i}得到:×<(,×<i 由(E)得到:(=)
由(E和FIRSTVT(E)={+,×,(,i}得到: (<+,(<×,(<(,(<i
+ ×( ) i $
由E)和LASTVT(E)={+,×,),i}得到: +>),×>),)>),i>)
关于$的优先关系,可认为有产生式
P↑F*F+Ti↑F*F+T 有 (<+、(<*、(<↑和( i。
4.4.2 算符优先文法的定义
3. 算符优先文法
➢ 定义:设有一不含ε规则的算符文法G,如任意两个 终结符对(a,b)在3种关系中只有一种优先关系成 立 , 则 称 G 是 一 个 算 符 优 先 文 法 (Operator Precedence Grammar),即OPG文法。
4.4.2 算符优先文法的定义
1 . 算符文法
➢ 定义:设文法 G ,如G中产生式的右部没有 两个非终结符相邻,则称G为算符文法,也 称OG文法(Operater Grammar)。
例如: 表达式文法 E→E+E|E×E|(E)|i 是算符文 法
4.4.2 算符优先文法的定义
➢性质
a.在算符文法中任何句型都不包含两个相邻的非终 结符。
寻找最左素短语方法:从左到右扫描W ,找到第 一< 个ai,a此j>时a,j+1时Ni,a记iN下i+a1aj,i+1再...回N扫jaj,Nj找+1到就第是一应个被a归i-1 约的最左素短语。
$T+T×F+i$
$<+< ×>+>$
4.4.4 算符优先分析算法
3 算符优先分析算法
输入:输入符号串W和优先关系表 输出:W是正确的句子,接收,否则出
2.最左素短语的识别 算符优先文法句型(括在两个$之间)一般
形式:W=$N1a1N2a2...NnanNn+1$, 其中ai是终结符,Ni是非终结符或空。 最左素短语的形式为: NiaiNi+1ai+1......NjajNj+1
4.4.4 算符优先分析算法
算符优先文法G的任何句型的最左素短语是满足 如下条件的最左子串 ai-1<ai ai=ai+1, ai+1=ai+2,…, aj-1= aj aj> aj+1
例 文法: E→E+T|T T→T×F|F F→(E)|i
FIRSTVT(E)={ +,×,i,( } LASTVT(E)={+ , ×, ) , i }
FIRSTVT(T)={ ×,i,( } LASTVT(T)={× , ) , i }
FIRSTVT(F)={ i,( }
LASTVT(F)={ ) , i }
4.4.3 算符优先关系表的构造
1.最左终结符集FIRSTVT
✓ FIRSTVT(B)={b|B=>+ b… 或 B=>+ Cb… } 其中b∈VT, B,C∈VN
✓ 直观上说FIRSTVT(B)是由B推导出的最左终结符 (允许左边有一非终结符)的集合。
例文法:E→E+T|T T→T×F|F F→(E)|i
FIRSTVT(E)={+,×,(,i} FIRSTVT(F)={(,i } FIRSTVT(T)={×,(,i }
4.4.3 算符优先关系表的构造(续)
2.最右终结符集LASTVT
✓ LASTVT(B)={a|B=>+…a 或 B=>+…aC}
其中a∈VT, B,C∈VN ✓ 直观上说LASTVT(B)是由B推导出的最右终结
4.4.4 算符优先分析算法
✓ 算符优先法每次归约最左素短语而不是 句柄
✓ 最左素短语的定义和确定方法是算符优 先分析算法的关键。
4.4.4 算符优先分析算法
1.最左素短语的定义 文法G[S]句型的素短语是一个短语,它至少
包含一个终结符,且除自身外不再包含其他 素短语。
处于句型最左边的素短语为最左素短语。
➢ 说明: 两个终结符之间的优先关系是有序的,算符优先文 法允许a>b,b>a同时存在,而不允许有a>b,a<b, a=b三种情况中的任两种同时存在。 例如:算符优先文法允许 + > ) ,) > +同时存在, 不允许 + > ) 和 + < ) 同时存在
4.4.2 算符优先文法的定义
例 表达式文法 E→E+E|E×E|(E)|i 由E→E+E且E=>+ E×E得+<× 由E→E×E且E=>+ E+E得+>× +和×的优先关系不唯一,所以不是算符优先文法
4.4.1 方法概述
1.算符优先分析法 依据算术表达式的运算符优先级,而定义算符之间的 某种优先关系,借助于这种关系寻找“可归约串”和 进行归约的一种语法分析方法。
2.基本思想 首先规定算符(终结符)之间的优先关系和结合性质, 然后借助此关系,比较相邻优先级来确定句型的可归 约串并进行归约 相邻:算符优先分析法只考虑终结符之间的优先关系, 不考虑非终结符,所以两个终结符相邻指其中无其他 的终结符(但可以有非终结符)
自下而上分析法:移进-归约分析法;
移进就是将一个终结符推进栈
归约就是将0个或多个符号从栈中弹出,根 据产生式将一个非终结符压入栈
移进-归约过程是自顶向下最右推导的逆过 程(规范归约,即最左归约)
4.3 自下而上分析法的一般原理
关键问题:如何在分析的过程中确定和识别可归 约串(规范归约句柄、算符优先最左素短语)
2) 对产生式右部终结符在前非终结符在后的相邻符 号对,即产生式右部有形如A→…aB…的符号对 (a,B),则a<FIRSTVT(B)
3) 对产生式右部非终结符在前终结符在后的相邻符 号对,即产生式右部有形如A→…Ba…的符号对 (B,a),则LASTVT(B)>a
4) 若S为文法开始符号,对FIRSTVT(S)中所有b, 置$<b;LASTVT(S)所有a,置a>$; $=$。
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈 输入符号串
动作
1) $ 2) $a 3) $ab
4) $aA
abbcde$ bbcde$ bcde$
bcde$
移进 移进 归约(A→b) 移进
5) $aAb
cde$
归约(A→Ab)
4.4.3 算符优先关系表的构造(续)
根据算符优先关系表可以判断文法是否为 算符优先文法
文法 E→E+T|T T→T×F|F F→(E)|i
的算符优先关系表为:
优先关系表中无多重定义 此文法是算符优先文法
+ ×( ) i $ + > < < >< > ×> > < >< > ( < < < =< ) >> > > i >> > > $ <<< < =
1) a =. b 当且仅当G中有形如 A→…ab… 或 A→…aBb… 的产生式。
A a δb
例如:有产生式F→(E) 所以( =. )
说明:δ为ε或B,a,b在用一句柄中同时归约所以 优先级相同
2) a <. b 当且仅当G中有形如 A → …aB… 的产生式, 且 B =>+ b… 或 B=>+ Cb…
4.3 自下而上分析法的一般原理
1.基本思想
➢ 从输入符号串开始,利用文法的产生式逐步 进行归约,试图归约到文法开始符
➢ 从语法树角度看,是以输入符号串作为语法 树的末端结点符号串,自底向上构造语法树, 如果最终根结点是文法开始符号,则输入符 号串是语言的一个句子,否则不是。
➢ 自底向上分析过程实际上是一个不断进行直 接归约的过程。
A
文法E→E+T|T
a
B
…
P
δb…
T→T×F|F F→(E)|i 由E→E+T T=>+ T×F
得+<.×
说明:δ为ε或C,a,b不在同一句柄中,b先归约, 所以a的优先级低于b
3) a >. b
当且仅当G中有形如 A→…Bb… 的产生式,
且 B=>+ …a 或 B=>+ …aC A
文法: E→E+T|T
由第(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
符(允许右边有一非终结符)的集合。
➢例文法: E→E+T|T T→T×F|F F→(E)|i
LASTVT(F)={),i} LASTVT(T)={×,),i} LASTVT(E)={+,×,),i}
4.4.3 算符优先关系表的构造
3.构造算符优先关系表算法
1) 对产生式右部终结符相邻的符号对,即产生式右 部有形如A→…ab… 或A→…aBb…的符号对 (a,b),则a=b
E’ →$E$而获得 $=$; 由$E,得$<FIRSTVT(E),即:
$<+,$<×,$<i,$<( 由E$,得LASTVT(E)>$, 即:
+>$,×>$,)>$,i>$
+ > < < >< > ×> > < >< > ( < < < =< ) >> > > i >> > > $ <<< < =
E E+ T E + TT × F
句型E+T+T×F 短语有: E+T
T×F E+T+T×F
4.4.2 算符优先文法的定义
2. G是算符文法,a,b∈VT ,A,B,C∈VN,算符 优先关系定义如下:
B
b
T→T×F|F
…
F→(E)|i
P
由E→E+T
E=>+ T×F
aδ …
得×>. +
说明: δ为ε或C ,a,b不在同一句柄中,a先归约,
所以a的优先级大于b
例:考虑下面的文法G(E):
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
例 文法:E→E+T|T T→T×F|F
的一个句型为 T+T×F+i
短语为:T,T×F,i,
T+T×F,
T+T×F+i
E
素短语为:T×F,i T
最左素短语为:T×F
F→(E)|i
E
E
+T
+T
F
T ×F i
规范归约每次归约当前句型中的句柄 算符优先分析每次归约当前句型的最左素短语。
4.4.4 算符优先分析算法
4.3 自下而上分析法的一般原理
2 基本实现方法 ➢ 设一个先进后出的符号栈,并将符号串边界符$移
入栈中. ➢ 分析时,对输入符号串自左向右进行扫描,并把
当前输入符号下压入栈中。 ➢ 边移进边分析,一旦栈顶符号串形成某个句型的
句柄(为某产生式的右部)时,就用相应的非终 结符(产生式的左部)替换它。 ➢ 重复这一过程,直到输入符号串的末端,此时如 果栈中只剩$和文法开始符号,则输入符号串是 文法的句子,否则不是。
依次考察每个产生式的右部:
ห้องสมุดไป่ตู้
+ ×( ) i $
由E+和LASTVT(E)={+,×,),i} 得到:+>+,×>+,)>+,i>+
由+T和FIRSTVT(T)={×,(,i} 得到:+<×,+<(,+<i
+><< < ×> ( )> i>
$
例 文法 E→E+T|T
T→T×F|F F→(E)|i
由T×和LASTVT(T)={×,),i} 得到: ×>×,)>×,i>×
➢ 何时移进?栈顶未形成可归约串 ➢ 何时归约?栈顶形成可归约串
常用自下向上分析法(根据可归约串识别方法的 不同):
算符优先分析法(根据优先关系确定栈顶是否可归约)
LR分析法(根据历史、现实、展望确定栈顶是否形成句 柄)
4.4 算符优先分析法
4.4.1 方法概述 4.4.2 算符优先文法的定义 4.4.3 算符优先关系表的构造 4.4.4 算符优先分析算法 4.4.5 优先函数 4.4.6 算符优先分析法的局限性
6) $aA
cde$
移进
7) $aAc
de$
移进
8) $ aAcd
e$
归约(B→d)
9) $aAcB
e$
10) $aAcBe
$
11) $S
$
移进 归约(S→aAcBe) 接受
对输入串abbcde$的移进-规约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子
S aAcBe aAcde aAbcde abbcde
4.4.1 方法概述
如:E+T×i,+和×相邻,×和i相邻, 但+和i不相邻
3.终结符间优先关系类型 终结符a和b之间的优先关系表示如下: a<.b 表示a的优先级低于b a=. b 表示a的优先级等于b a>. b 表示a的优先级高于b
注意:<.,=. ,.>是三种有序关系,与数学中的<, =,>不同,所以a=. b不意味b=. a,a>. b不意味 b<. a
由×F和FIRSTVT(F)={(,i}得到:×<(,×<i 由(E)得到:(=)
由(E和FIRSTVT(E)={+,×,(,i}得到: (<+,(<×,(<(,(<i
+ ×( ) i $
由E)和LASTVT(E)={+,×,),i}得到: +>),×>),)>),i>)
关于$的优先关系,可认为有产生式
P↑F*F+Ti↑F*F+T 有 (<+、(<*、(<↑和( i。
4.4.2 算符优先文法的定义
3. 算符优先文法
➢ 定义:设有一不含ε规则的算符文法G,如任意两个 终结符对(a,b)在3种关系中只有一种优先关系成 立 , 则 称 G 是 一 个 算 符 优 先 文 法 (Operator Precedence Grammar),即OPG文法。
4.4.2 算符优先文法的定义
1 . 算符文法
➢ 定义:设文法 G ,如G中产生式的右部没有 两个非终结符相邻,则称G为算符文法,也 称OG文法(Operater Grammar)。
例如: 表达式文法 E→E+E|E×E|(E)|i 是算符文 法
4.4.2 算符优先文法的定义
➢性质
a.在算符文法中任何句型都不包含两个相邻的非终 结符。
寻找最左素短语方法:从左到右扫描W ,找到第 一< 个ai,a此j>时a,j+1时Ni,a记iN下i+a1aj,i+1再...回N扫jaj,Nj找+1到就第是一应个被a归i-1 约的最左素短语。
$T+T×F+i$
$<+< ×>+>$
4.4.4 算符优先分析算法
3 算符优先分析算法
输入:输入符号串W和优先关系表 输出:W是正确的句子,接收,否则出
2.最左素短语的识别 算符优先文法句型(括在两个$之间)一般
形式:W=$N1a1N2a2...NnanNn+1$, 其中ai是终结符,Ni是非终结符或空。 最左素短语的形式为: NiaiNi+1ai+1......NjajNj+1
4.4.4 算符优先分析算法
算符优先文法G的任何句型的最左素短语是满足 如下条件的最左子串 ai-1<ai ai=ai+1, ai+1=ai+2,…, aj-1= aj aj> aj+1
例 文法: E→E+T|T T→T×F|F F→(E)|i
FIRSTVT(E)={ +,×,i,( } LASTVT(E)={+ , ×, ) , i }
FIRSTVT(T)={ ×,i,( } LASTVT(T)={× , ) , i }
FIRSTVT(F)={ i,( }
LASTVT(F)={ ) , i }
4.4.3 算符优先关系表的构造
1.最左终结符集FIRSTVT
✓ FIRSTVT(B)={b|B=>+ b… 或 B=>+ Cb… } 其中b∈VT, B,C∈VN
✓ 直观上说FIRSTVT(B)是由B推导出的最左终结符 (允许左边有一非终结符)的集合。
例文法:E→E+T|T T→T×F|F F→(E)|i
FIRSTVT(E)={+,×,(,i} FIRSTVT(F)={(,i } FIRSTVT(T)={×,(,i }
4.4.3 算符优先关系表的构造(续)
2.最右终结符集LASTVT
✓ LASTVT(B)={a|B=>+…a 或 B=>+…aC}
其中a∈VT, B,C∈VN ✓ 直观上说LASTVT(B)是由B推导出的最右终结
4.4.4 算符优先分析算法
✓ 算符优先法每次归约最左素短语而不是 句柄
✓ 最左素短语的定义和确定方法是算符优 先分析算法的关键。
4.4.4 算符优先分析算法
1.最左素短语的定义 文法G[S]句型的素短语是一个短语,它至少
包含一个终结符,且除自身外不再包含其他 素短语。
处于句型最左边的素短语为最左素短语。
➢ 说明: 两个终结符之间的优先关系是有序的,算符优先文 法允许a>b,b>a同时存在,而不允许有a>b,a<b, a=b三种情况中的任两种同时存在。 例如:算符优先文法允许 + > ) ,) > +同时存在, 不允许 + > ) 和 + < ) 同时存在
4.4.2 算符优先文法的定义
例 表达式文法 E→E+E|E×E|(E)|i 由E→E+E且E=>+ E×E得+<× 由E→E×E且E=>+ E+E得+>× +和×的优先关系不唯一,所以不是算符优先文法
4.4.1 方法概述
1.算符优先分析法 依据算术表达式的运算符优先级,而定义算符之间的 某种优先关系,借助于这种关系寻找“可归约串”和 进行归约的一种语法分析方法。
2.基本思想 首先规定算符(终结符)之间的优先关系和结合性质, 然后借助此关系,比较相邻优先级来确定句型的可归 约串并进行归约 相邻:算符优先分析法只考虑终结符之间的优先关系, 不考虑非终结符,所以两个终结符相邻指其中无其他 的终结符(但可以有非终结符)
自下而上分析法:移进-归约分析法;
移进就是将一个终结符推进栈
归约就是将0个或多个符号从栈中弹出,根 据产生式将一个非终结符压入栈
移进-归约过程是自顶向下最右推导的逆过 程(规范归约,即最左归约)
4.3 自下而上分析法的一般原理
关键问题:如何在分析的过程中确定和识别可归 约串(规范归约句柄、算符优先最左素短语)
2) 对产生式右部终结符在前非终结符在后的相邻符 号对,即产生式右部有形如A→…aB…的符号对 (a,B),则a<FIRSTVT(B)
3) 对产生式右部非终结符在前终结符在后的相邻符 号对,即产生式右部有形如A→…Ba…的符号对 (B,a),则LASTVT(B)>a
4) 若S为文法开始符号,对FIRSTVT(S)中所有b, 置$<b;LASTVT(S)所有a,置a>$; $=$。
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈 输入符号串
动作
1) $ 2) $a 3) $ab
4) $aA
abbcde$ bbcde$ bcde$
bcde$
移进 移进 归约(A→b) 移进
5) $aAb
cde$
归约(A→Ab)
4.4.3 算符优先关系表的构造(续)
根据算符优先关系表可以判断文法是否为 算符优先文法
文法 E→E+T|T T→T×F|F F→(E)|i
的算符优先关系表为:
优先关系表中无多重定义 此文法是算符优先文法
+ ×( ) i $ + > < < >< > ×> > < >< > ( < < < =< ) >> > > i >> > > $ <<< < =
1) a =. b 当且仅当G中有形如 A→…ab… 或 A→…aBb… 的产生式。
A a δb
例如:有产生式F→(E) 所以( =. )
说明:δ为ε或B,a,b在用一句柄中同时归约所以 优先级相同
2) a <. b 当且仅当G中有形如 A → …aB… 的产生式, 且 B =>+ b… 或 B=>+ Cb…
4.3 自下而上分析法的一般原理
1.基本思想
➢ 从输入符号串开始,利用文法的产生式逐步 进行归约,试图归约到文法开始符
➢ 从语法树角度看,是以输入符号串作为语法 树的末端结点符号串,自底向上构造语法树, 如果最终根结点是文法开始符号,则输入符 号串是语言的一个句子,否则不是。
➢ 自底向上分析过程实际上是一个不断进行直 接归约的过程。
A
文法E→E+T|T
a
B
…
P
δb…
T→T×F|F F→(E)|i 由E→E+T T=>+ T×F
得+<.×
说明:δ为ε或C,a,b不在同一句柄中,b先归约, 所以a的优先级低于b
3) a >. b
当且仅当G中有形如 A→…Bb… 的产生式,
且 B=>+ …a 或 B=>+ …aC A
文法: E→E+T|T
由第(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
符(允许右边有一非终结符)的集合。
➢例文法: E→E+T|T T→T×F|F F→(E)|i
LASTVT(F)={),i} LASTVT(T)={×,),i} LASTVT(E)={+,×,),i}
4.4.3 算符优先关系表的构造
3.构造算符优先关系表算法
1) 对产生式右部终结符相邻的符号对,即产生式右 部有形如A→…ab… 或A→…aBb…的符号对 (a,b),则a=b
E’ →$E$而获得 $=$; 由$E,得$<FIRSTVT(E),即:
$<+,$<×,$<i,$<( 由E$,得LASTVT(E)>$, 即:
+>$,×>$,)>$,i>$
+ > < < >< > ×> > < >< > ( < < < =< ) >> > > i >> > > $ <<< < =