第6章 自底向上优先分析法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
3. 算符优先文法的定义(Operater Precedence G)
设有一个不含ε规则的算符文法G,如果任意两个终结符
对(a,b)在<· ,· >, =·三种关系中只有一种成立,则称G是
算符优先文法,也称OPG文法。
判断: G[E]是否是OG,是否是OPG文法。 E E+E | E*E | (E) | id
(2) 由F P,T F, E T,栈顶(6)的内容逐次改变为: (F, i), (T, i), (E, i) FIRSTVT(E’)={#} FIRSTVT(E)={+, *, ↑, i, (} FIRSTVT(T)={*, ↑, i, (} 弹出 FIRSTVT(F)={↑, i, (} FIRSTVT(P)={i, (}
(2)E+id*id
句子id+id*id有两个不同的规范归约(归约中句柄不唯一):
第1个规范归约: (1)id+id*id
(3)E+E*id (5)E+E 第2个规范归约过程: (1)id+id*id
(4)E+E*E (6)E
(2)E+id*id
(3)E+E*id
(5)E*E
(4)E*id
(6)E
12
(1) 若有产生式Aa…或ABa…, 则a∈FIRSTVT(A)
(2) 若a∈FIRSTVT(B),且有产生式AB…,则 a∈FIRSTVT(A)
类似的方法求得每个VN的LASTVT(A) (1) 若有产生式A …a或A …aB, 则a∈LASTVT(A)
(2) 若a∈LASTVT(B),且有产生式A …B,则a
)· >b ,
)· >a
7
6.2.2 简单优先文法的定义
一、定义
简单优先文法满足两个条件
(1)任意两个文法符号之间最多只有一种优先关系成立 (2)在G中任意两个产生式没有相同的右部(归约唯一) 分析:栈顶为ai
ai <·ai+1 移进 ai · > ai+1 归约(已形成句柄)
8
6.2.2 简单优先文法的定义
三种优先关系:
(1)对形如A…ab…, A…aBb…,有a =·b (2)对形如A…aB…, 有a <· b, b∈FIRSTVT(B) (3) 对形如A…Bb…,有a · > b, a∈LASTVT(B)
21
6.3.3 算符优先关系表的构造
1.算法基于两条规则
求得每个VN的FIRSTVT(A))
二、简单优先分析法
步骤:构造文法的优先关系矩阵,将G规则保存,设
置符号栈S
(1)将输入串a1,a2,…an #逐个移入符号栈S中,直到栈顶符 号 ai · > ai+1为止。 (2)栈顶ai为句柄尾,由此向左在栈中找句柄开头符号ak(找 到ak-1 <·ak为止) (3)由句柄akak+1…ai在产生式中查找右部为ak…ai的产生式, 若找到则用相应左部代替句柄(归约),否则出错,串不是 合法句子。
根据优先关系定义,可按如下方法直接构造优先关系表。
首先,对G中每个非终结符A,定义两个集合:
+ b…或A + Bb…, b∈V , B∈V } FIRSTVT(A)={b | A T N + …a或A + …aB, a∈V , B∈V } LASTVT(A)={a | A T N
+ Y… X<· Y iff A…XB…且B
X· >Y iff
+ …X和D Y… A…BD…且B
+
例6.2 SbAb, A(B | a, BAa)
(1)相等:b=· A,A=· b,(=· B,A=· a,a=· ) (2) <·: (3) · >: 由bA及A(B | a , BAa) ,可得 b <· ( , b <· a,(<· A, (<· ( , (<· a 由 S bAb , A(B | a 及 B Aa),可得 B· >b, B· >a a· >b , a· >a
根据识别可归约串的不同方法,也形成不同的自下而上分析法。
简单优先分析法和LR分析法都是规范归约分析法(句柄—可归 约串),但它们识别句柄的方法不同:
1.LR分析法是根据历史、现实、展望三者信息来确定栈顶符号串 是否形成句柄
2.简单优先分析法是根据文法符号之间的优先关系来确定句柄。
5
6.1 自底向上优先分析法概述
关键:如何定义任意两个可能相邻出现的终极符a和b
之间的优先关系。
优先关系符:
a <·b a的优先级低于b
a =·b
a· >b
a的优先级等于b
a的优先级大于b
与出现的左右次序有关,a <·b不认为b · >a
14
三、适用范围
算符优先分析法只适用于算符优先文法,
即对文法有一定要求。
15
6.3.2 算符优先文法的定义
24
构造G的优先关系表算法
(1) 为每一个A∈VN,计算FIRSTVT(A)和LASTVT(A)
(2) 执行程序
for (每个产生式Ax1x2…xn) for (i=1; i<=n-1; i++) { if (xi∈VT且xi+1∈VT) 置xi=xi+1 if (i<=n-2且xi∈VT且xi+1∈VT且xi+2∈VN) 置xi=xi+2 if (xi∈VT, xi+1∈VN) for (FIRSTVT(xi+1)中的每个变量b) 置xi<b; if (xi∈VN, xi+1∈VT) for (LASTVT(xi)中的每个a) 置a>xi+1; }
一、方法
算符优先分析法就是依据四则运算过程而设计 的一种语言分析方法。首先要规定运算符(广 义为终结符)之间的优先关系和结合性质,然 后比较相邻运算符的优先级来确定句型的可归 约串并进行归约
11
6.3.1 算符优先分析法概述
实例分析:G[E]:EE+E | E*E |(E)|id(歧义文法)
16
6.3.2 算符优先文法的定义
2. 定义任意两个终结符号之间的优先关系
设G是一个不含ε规则的OG文法,a、b是任意两个终
结符,A、B、C是非终结符,算符优先关系=· , <· ,· >定 义如下:
(1) a =· b当且仅当G中含有形如A…ab…或A…aBb…规则 (2) a <· b当且仅当G中含有形如A…aB…产生式且
8
9
#aAcB
#aAcBe #
e#
# 用SaAcBe归约
10 #S
4
二、自底向上分析的关键
如何精确定义可归约串并识别。 对可归约串(p23)的不同定义形成不同的自下而上分析方法: 1.在规范归约分析中,用句柄来刻画可归约串 (LR, 简单优先) 2.在算符优先分析中,是用最左素短语来刻画可归约串。
9
6.3 算符优先分析法
特别适合于分析程序中各类表达式且宜于手工实 现—简单、直观(仅适用于表达式的语法)
6.3.1 方法概述 6.3.2 算符优先文法的定义 6.3.3 算符优先关系表的构造(由定义) 6.3.4 算符优先分析算法 6.3.6 算符优先分析法的局限(p120)
10
6.3.1 算符优先分析法概述
(3) 对FIRSTVT(S)中的所有b,置#<b;对LASTVT(S)中的所有a,置a>#; 置#=#。(S为G的开始符号)
25
例:设有G[E]: EE+T | T, TT*F | F, F(E) | id, 构造出算符优先关系表 表达式文法的算符优先关系表 + + * · > · > * <· · > ( <· <· ) · > · > id <· <· # · > · >
界符’#’,成功。否则,报错。
3
例.(p94) (1) S aAcBe (2) A b (3) A Ab (4) B d, 对输入 串abbcde#语法分析走一遍动作。
符号栈 0 1 2 3 4 5 6 7 # #a #ab #aA #aAb #aA #aAc #aAcd 输入串 abbcde# bbcde# bcde# 用Ab归约 bcde# cde# 用AAb归约 cde# de# e# 用Bd归约
FIRSTVT
E +,*,(,id
LASTVT
+,*,),id
T
F
↑ <· <·
*,(,id
(,id
+· >+
*,),id
),id
(- · > -)
*· >*
↑ <·↑ *, / 其次 +, -最低
(满足左结合)
(右结合)
(
) id # ↑
<·
· > · > <· · >
<·
· > · > <· · >
19
(1)G[E]是OG文法
(2)G[E]不是OPG文法
E E + E E * E E E + E * E E
(a) + < *
(b) + > *
+,*之间优先关系不唯一 而:G′ [E] :E E+T | T T T*F | F F (E) | id 是OPG文法
20
6.3.3 算符优先关系表的构造(由定义)
第六章 自底向上优先分析法
1
本章内容
引子:自底向上分析的一般原理 6.1 自底向上优先分析概述 6.2 简单优先分析法(了解) 6.3 算符优先分析法
2
引子:自底向上分析的一般原理
一、自底向上分析的基本思想
对输入串从左到右扫描,并逐个移入栈中。边移入边分
析,一旦栈顶符号串形成某个句型的可归约串(它对应 某产生式右部),就用该产生式左部的非终极符号代替 它,完成进一步归约。 重复这一过程直到归约到栈中,只剩下开始符号和右边
1. 算符文法的定义(Operater Grammar) 设有文法G,若G中没有形如A…BC…的产生式,
其中B,C∈VN,则称G为算符文法,也称为OG文法。
算符文法具有两个重要性质: (1)在OG文法中,任何句型都不包含两个相邻的非 终结符。 (2)若Ab或bA出现在算符文法的句型β中,A ∈VN, b ∈VT,则β中任何含b的短语必含有A
6.3.1 算符优先分析法概述
分析:句型E+E*id (1) id是它的句柄 (2) E+E是它的句柄
原因:没有定义+和*的优先关系 (1) 假定*优先于+,不能立即把E+E归约为E
(2) 假定+优先于*,因此先把E+E归约为E
决定因素:相邻两个终极符之间的优先关系
13
二、算符优先分析法的关键
1.简单优先分析法:对一文法求出所有符号之 间的优先关系,并据此确定句柄(规范归约)
2.算符优先分析法:只考虑算符之间的优先关 系,不考虑VN的优先关系。只要找到可归约串
就归约,并不考虑归约到哪个非终极符。
6
6.2 简单优先分析法(了解)
6.2.1 优先关系
X=· Y iff A…XY…
a∈LASTVT(A)
22
2. 算法描述
[p112]
Procedure Insert(A,a); 功能:求FIRSTVT元素 IF NUT F[A,a] THEN Begin F[A,a]:=TRUE PUSH(A,a) ONTO STACK End // 当a∈FIRSTVT(A)时,置F[A,a]为真,并将符号对(A,a)下推到栈中 BEGIN (MAIN) For 每一个非终结符A和终结符a Do F[A,a]:=FALSE; For 每个形如Aa…或ABa…的产生式 Do Insert(A,a) WHILE STACK非空 DO Begin 把STACK的栈顶记为(B,a)弹出 For 每个形如AB…的产生式 DO Insert(A, a) End End (MAIN)
<·
=·
· > · >
<·
空
· > · >
<·
· > · > <· <·
+ +b…或B B Cb…
Βιβλιοθήκη Baidu
(3) a · >b当且仅当G中含有形如A…Bb…产生式且
+ + B …a 或 B …aC
17
图(a):δ为ε或为C(a,b在同一可归约串中,同时归约) 图(b):a,b不在同一可归约串中,b先归约,所以a <· b) 图(c):a,b不在同一可归约串中,a先归约,所以a · >b)
23
例: 0 E‘# E # 1 E E+T | T 3 T T*F | F 5 F P | F | P 7 P (E) 8 P I 对表达式求所有VN的FIRST(B)
(1) 第一次扫描后,STACK栈的初值为: 6. (p, i) (F, 1) (T, i) (E, i) 5. (p, () (F, 1) (T, 1) (E, 1) 4. (F, ↑) (T, ↑) (E, ↑) 3. (T, *) (E, *) 2. (E, +) 1. (E’, #)
3. 算符优先文法的定义(Operater Precedence G)
设有一个不含ε规则的算符文法G,如果任意两个终结符
对(a,b)在<· ,· >, =·三种关系中只有一种成立,则称G是
算符优先文法,也称OPG文法。
判断: G[E]是否是OG,是否是OPG文法。 E E+E | E*E | (E) | id
(2) 由F P,T F, E T,栈顶(6)的内容逐次改变为: (F, i), (T, i), (E, i) FIRSTVT(E’)={#} FIRSTVT(E)={+, *, ↑, i, (} FIRSTVT(T)={*, ↑, i, (} 弹出 FIRSTVT(F)={↑, i, (} FIRSTVT(P)={i, (}
(2)E+id*id
句子id+id*id有两个不同的规范归约(归约中句柄不唯一):
第1个规范归约: (1)id+id*id
(3)E+E*id (5)E+E 第2个规范归约过程: (1)id+id*id
(4)E+E*E (6)E
(2)E+id*id
(3)E+E*id
(5)E*E
(4)E*id
(6)E
12
(1) 若有产生式Aa…或ABa…, 则a∈FIRSTVT(A)
(2) 若a∈FIRSTVT(B),且有产生式AB…,则 a∈FIRSTVT(A)
类似的方法求得每个VN的LASTVT(A) (1) 若有产生式A …a或A …aB, 则a∈LASTVT(A)
(2) 若a∈LASTVT(B),且有产生式A …B,则a
)· >b ,
)· >a
7
6.2.2 简单优先文法的定义
一、定义
简单优先文法满足两个条件
(1)任意两个文法符号之间最多只有一种优先关系成立 (2)在G中任意两个产生式没有相同的右部(归约唯一) 分析:栈顶为ai
ai <·ai+1 移进 ai · > ai+1 归约(已形成句柄)
8
6.2.2 简单优先文法的定义
三种优先关系:
(1)对形如A…ab…, A…aBb…,有a =·b (2)对形如A…aB…, 有a <· b, b∈FIRSTVT(B) (3) 对形如A…Bb…,有a · > b, a∈LASTVT(B)
21
6.3.3 算符优先关系表的构造
1.算法基于两条规则
求得每个VN的FIRSTVT(A))
二、简单优先分析法
步骤:构造文法的优先关系矩阵,将G规则保存,设
置符号栈S
(1)将输入串a1,a2,…an #逐个移入符号栈S中,直到栈顶符 号 ai · > ai+1为止。 (2)栈顶ai为句柄尾,由此向左在栈中找句柄开头符号ak(找 到ak-1 <·ak为止) (3)由句柄akak+1…ai在产生式中查找右部为ak…ai的产生式, 若找到则用相应左部代替句柄(归约),否则出错,串不是 合法句子。
根据优先关系定义,可按如下方法直接构造优先关系表。
首先,对G中每个非终结符A,定义两个集合:
+ b…或A + Bb…, b∈V , B∈V } FIRSTVT(A)={b | A T N + …a或A + …aB, a∈V , B∈V } LASTVT(A)={a | A T N
+ Y… X<· Y iff A…XB…且B
X· >Y iff
+ …X和D Y… A…BD…且B
+
例6.2 SbAb, A(B | a, BAa)
(1)相等:b=· A,A=· b,(=· B,A=· a,a=· ) (2) <·: (3) · >: 由bA及A(B | a , BAa) ,可得 b <· ( , b <· a,(<· A, (<· ( , (<· a 由 S bAb , A(B | a 及 B Aa),可得 B· >b, B· >a a· >b , a· >a
根据识别可归约串的不同方法,也形成不同的自下而上分析法。
简单优先分析法和LR分析法都是规范归约分析法(句柄—可归 约串),但它们识别句柄的方法不同:
1.LR分析法是根据历史、现实、展望三者信息来确定栈顶符号串 是否形成句柄
2.简单优先分析法是根据文法符号之间的优先关系来确定句柄。
5
6.1 自底向上优先分析法概述
关键:如何定义任意两个可能相邻出现的终极符a和b
之间的优先关系。
优先关系符:
a <·b a的优先级低于b
a =·b
a· >b
a的优先级等于b
a的优先级大于b
与出现的左右次序有关,a <·b不认为b · >a
14
三、适用范围
算符优先分析法只适用于算符优先文法,
即对文法有一定要求。
15
6.3.2 算符优先文法的定义
24
构造G的优先关系表算法
(1) 为每一个A∈VN,计算FIRSTVT(A)和LASTVT(A)
(2) 执行程序
for (每个产生式Ax1x2…xn) for (i=1; i<=n-1; i++) { if (xi∈VT且xi+1∈VT) 置xi=xi+1 if (i<=n-2且xi∈VT且xi+1∈VT且xi+2∈VN) 置xi=xi+2 if (xi∈VT, xi+1∈VN) for (FIRSTVT(xi+1)中的每个变量b) 置xi<b; if (xi∈VN, xi+1∈VT) for (LASTVT(xi)中的每个a) 置a>xi+1; }
一、方法
算符优先分析法就是依据四则运算过程而设计 的一种语言分析方法。首先要规定运算符(广 义为终结符)之间的优先关系和结合性质,然 后比较相邻运算符的优先级来确定句型的可归 约串并进行归约
11
6.3.1 算符优先分析法概述
实例分析:G[E]:EE+E | E*E |(E)|id(歧义文法)
16
6.3.2 算符优先文法的定义
2. 定义任意两个终结符号之间的优先关系
设G是一个不含ε规则的OG文法,a、b是任意两个终
结符,A、B、C是非终结符,算符优先关系=· , <· ,· >定 义如下:
(1) a =· b当且仅当G中含有形如A…ab…或A…aBb…规则 (2) a <· b当且仅当G中含有形如A…aB…产生式且
8
9
#aAcB
#aAcBe #
e#
# 用SaAcBe归约
10 #S
4
二、自底向上分析的关键
如何精确定义可归约串并识别。 对可归约串(p23)的不同定义形成不同的自下而上分析方法: 1.在规范归约分析中,用句柄来刻画可归约串 (LR, 简单优先) 2.在算符优先分析中,是用最左素短语来刻画可归约串。
9
6.3 算符优先分析法
特别适合于分析程序中各类表达式且宜于手工实 现—简单、直观(仅适用于表达式的语法)
6.3.1 方法概述 6.3.2 算符优先文法的定义 6.3.3 算符优先关系表的构造(由定义) 6.3.4 算符优先分析算法 6.3.6 算符优先分析法的局限(p120)
10
6.3.1 算符优先分析法概述
(3) 对FIRSTVT(S)中的所有b,置#<b;对LASTVT(S)中的所有a,置a>#; 置#=#。(S为G的开始符号)
25
例:设有G[E]: EE+T | T, TT*F | F, F(E) | id, 构造出算符优先关系表 表达式文法的算符优先关系表 + + * · > · > * <· · > ( <· <· ) · > · > id <· <· # · > · >
界符’#’,成功。否则,报错。
3
例.(p94) (1) S aAcBe (2) A b (3) A Ab (4) B d, 对输入 串abbcde#语法分析走一遍动作。
符号栈 0 1 2 3 4 5 6 7 # #a #ab #aA #aAb #aA #aAc #aAcd 输入串 abbcde# bbcde# bcde# 用Ab归约 bcde# cde# 用AAb归约 cde# de# e# 用Bd归约
FIRSTVT
E +,*,(,id
LASTVT
+,*,),id
T
F
↑ <· <·
*,(,id
(,id
+· >+
*,),id
),id
(- · > -)
*· >*
↑ <·↑ *, / 其次 +, -最低
(满足左结合)
(右结合)
(
) id # ↑
<·
· > · > <· · >
<·
· > · > <· · >
19
(1)G[E]是OG文法
(2)G[E]不是OPG文法
E E + E E * E E E + E * E E
(a) + < *
(b) + > *
+,*之间优先关系不唯一 而:G′ [E] :E E+T | T T T*F | F F (E) | id 是OPG文法
20
6.3.3 算符优先关系表的构造(由定义)
第六章 自底向上优先分析法
1
本章内容
引子:自底向上分析的一般原理 6.1 自底向上优先分析概述 6.2 简单优先分析法(了解) 6.3 算符优先分析法
2
引子:自底向上分析的一般原理
一、自底向上分析的基本思想
对输入串从左到右扫描,并逐个移入栈中。边移入边分
析,一旦栈顶符号串形成某个句型的可归约串(它对应 某产生式右部),就用该产生式左部的非终极符号代替 它,完成进一步归约。 重复这一过程直到归约到栈中,只剩下开始符号和右边
1. 算符文法的定义(Operater Grammar) 设有文法G,若G中没有形如A…BC…的产生式,
其中B,C∈VN,则称G为算符文法,也称为OG文法。
算符文法具有两个重要性质: (1)在OG文法中,任何句型都不包含两个相邻的非 终结符。 (2)若Ab或bA出现在算符文法的句型β中,A ∈VN, b ∈VT,则β中任何含b的短语必含有A
6.3.1 算符优先分析法概述
分析:句型E+E*id (1) id是它的句柄 (2) E+E是它的句柄
原因:没有定义+和*的优先关系 (1) 假定*优先于+,不能立即把E+E归约为E
(2) 假定+优先于*,因此先把E+E归约为E
决定因素:相邻两个终极符之间的优先关系
13
二、算符优先分析法的关键
1.简单优先分析法:对一文法求出所有符号之 间的优先关系,并据此确定句柄(规范归约)
2.算符优先分析法:只考虑算符之间的优先关 系,不考虑VN的优先关系。只要找到可归约串
就归约,并不考虑归约到哪个非终极符。
6
6.2 简单优先分析法(了解)
6.2.1 优先关系
X=· Y iff A…XY…
a∈LASTVT(A)
22
2. 算法描述
[p112]
Procedure Insert(A,a); 功能:求FIRSTVT元素 IF NUT F[A,a] THEN Begin F[A,a]:=TRUE PUSH(A,a) ONTO STACK End // 当a∈FIRSTVT(A)时,置F[A,a]为真,并将符号对(A,a)下推到栈中 BEGIN (MAIN) For 每一个非终结符A和终结符a Do F[A,a]:=FALSE; For 每个形如Aa…或ABa…的产生式 Do Insert(A,a) WHILE STACK非空 DO Begin 把STACK的栈顶记为(B,a)弹出 For 每个形如AB…的产生式 DO Insert(A, a) End End (MAIN)
<·
=·
· > · >
<·
空
· > · >
<·
· > · > <· <·
+ +b…或B B Cb…
Βιβλιοθήκη Baidu
(3) a · >b当且仅当G中含有形如A…Bb…产生式且
+ + B …a 或 B …aC
17
图(a):δ为ε或为C(a,b在同一可归约串中,同时归约) 图(b):a,b不在同一可归约串中,b先归约,所以a <· b) 图(c):a,b不在同一可归约串中,a先归约,所以a · >b)
23
例: 0 E‘# E # 1 E E+T | T 3 T T*F | F 5 F P | F | P 7 P (E) 8 P I 对表达式求所有VN的FIRST(B)
(1) 第一次扫描后,STACK栈的初值为: 6. (p, i) (F, 1) (T, i) (E, i) 5. (p, () (F, 1) (T, 1) (E, 1) 4. (F, ↑) (T, ↑) (E, ↑) 3. (T, *) (E, *) 2. (E, +) 1. (E’, #)