自底向上分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.3.1 直观算符优先文法
运算法则: 1.乘除的优先大于加减 2.同优先级的运算符左大于右 3.括号内的优先级大于括号外
于是: 4+8-6/2*3 运算过程和结果唯一。 12
例: G[E] E→E+E | E*E | (E) | i
Vt={+, *, (, ), i} 这是一个二义文法,要用算符优先法分析有该文法所确定的 语言句子。 如:i+i*i
算法 : 从优先关系构造优先函数 方法:
1. a∈VT∪{#},建立两个符号fa和ga; 2. 若a = b, 从fa至gb画一条弧;也从gb至fa画
一条弧
3. a,b ∈VT, 若a·>b,则从fa至gb画一条弧; 若a<·b,则从gb至fa画一条弧;
4. 若图中无环,则存在优先函数, f(a)和g(b)等于从fa 和gb出发所能到达的结点
26
(3)算符优先分析算法的实现.
先定义优先级,在分析过程中通过比较相邻 运算符之间的优先级来确定句型的“句柄”并进 行归约.
? 最左素短语
[定义] 素短语:文法G的句型的素短语是一个短 语,它至少包含有一个终结符号,并且除它自身 以外不再包含其他素短语.
31
步骤
1 2 3 4
句型
*
.> .>
<. <. .> .>
i
.> .>
.> .>
(
<. <. <. <. =
)
.> .>
.> .>
#
<. <. <. <.
3)矩阵元素空白处表示这两个终结符不能相邻,故没有优先关系
14
(2) 分析过程 i+i*i
ab
+
+
.>
*
.>
i
.>
.
(
.<
)
.>
#
<
算法:
当栈顶项(或次栈顶 项)终结符的优先级 大于栈外的终结符的 优先级则进行规约, 否则移进.
PROCEDBRE INSERT(A,b) IF NOT F[A,b] THEN BEGIN F[A,b]:=TRAE 把(A,b)推进S栈 /* b∈FIRSTVT(A) */ END
BEGIN {main} FOR 每个非终结符号A和终结符b DO F[A,b]:=FALSE /*赋值符*/ FOR 每个形如A::=b…或A::=Bb… 的规则 DO INSERT(A,b)
E→E+E | E*E | (E) | i
步骤 1 2 3 4 5 6 7 8 9 10 11
*
i
(
)
#
<.
<.
<.
.>
.>
.>
<.
<.
.>
.>
.> . <.
. . <
.
.>
<.
. =.
.> .
>.
>
>
<
<
<
符号栈 # #i #E #E+
#E+i #E+E #E+E* #E+E*i #E+E*E #E+E #E
(1) 先确定终结符之间的优先关系
优先关系的定义:
设 a, b 为可能相邻的终结符
定义: a =. b
a的优先级等于b
a<. b
a的优先级小于b
a .> b
a的优先级大于b
13
2)例中文法终结符之间的优先关系可以用一个矩阵M来表示
b(右栈外) +
a(右栈内)
+
.>
*
i
(
)
#
<. <. <. .> .>
#T+T*F+i# #T+T+i# #E+i# #E+F#
关系
最左子串 规约符号
#<.+<.*>. +<.i.># T*F
T
#<.+>. +<.i.># T+T
E
#<. +<.i.>#
i
F
#<. +.>#
E+F
E
可以看出: 1. 每次规约最左子串,确实是当前句型的最左素短语 (语法树) 2. 规约的不都是真句柄(仅i规约为F是句柄,但它 是最左短语) 3. 没有完全按规则进行规约,因为素短语不一定是简 单短语
输入串 i+i*i# +i*i# +i*i#
Βιβλιοθήκη Baidui*i# *i# *i#
i# # # # #
优先关系 动作
#<i 移进
i>+ 规约
#<+ 移进
+<i 移进
i>* 规约
+<* 移进 *<i 移进 i># 规约 *># 规约
+># 规约 接受 15
算符优先文法(OPG)的定义
设有一OG文法,如果在任意两个终结符之间, 至多只有 上述关系中的一种,则称该文法为 算符优先文法(OPG)
35
优先函数
为了节约存储空间和便于执行比较运算?,用两 个优先函数f和g,它们是从终结符号映射到整数 的函数。对于终结符号a和b选择f和g,使之满足:
1. 当a=b时, f(a)= g(b); 2 .当a<·b时, f(a)<g(b); 3. 当a·>b时, f(a)> g(b)。 于是a和b之间的优先关系可以由比较f(a)与 g(b)的大小来决定。
B →Aa) A=a,a=),B>a,a>a,)>a
Sb A( Ba ) #
S
>
b
=<
<
>
A
=
=
(
<<=<
B
>
>
a
>
>=
)
>
>
#<<
=
6.3 算符优先分析(OperatorPrecedence Parsing)
1) 这是一种经典的自底向上分析法,简单直观,并被广泛使 用。
2) 称为算符优先分析是因为这种方法是仿效算术式的四则运算 而建立起来的,作算术式的四则运算时,为了保证计算结果 和过程的唯一性,规定了一个统一的四则运算法则,规定运 算符之间的优先关系。
6.1 自底向上分析
基本算法思想: 若采用自左向右的描述和分析输入串,那么自
底向上的基本算法是: 从输入符号串开始,通过重复查找当前句型的
句柄(最左简单短语),并利用有关规则进行规约, 若能规约为文法的识别符号,则表示分析成功,输 入符号串是文法的合法句子,否则有语法错误。
1
例:G[S]: S→aAcBe A→b A→Ab B→d 输入串为abbcde,检查是否是该文法的合法句子。
对于OG算法的几点说明:
1) 运算是以中缀形式出现的 2) 可以证明,若文法为OG文法,则不会出现 两个非终结符相邻的句型。 3) 算法语言中的表达式以及大部分语言成分 的文法均是OG文法
20
具体方法如下:
设一个栈S和一个二维布尔数组F F[A,b]=TRAE iff b∈FIRSTVT(A)
若采用自底向上分析,即能否一步步规约当前句型的句柄, 最终规约到识别符号S。先设立一个符号栈,我们统一符号 “#”作为待分析的符号串的左右分界符。 作为初始状态,先将符号串的分界符推进符号栈,作为栈底 符号。
分析过程如下表:
5
S→bAb b=A, A=b ,b<(,b<a,)>b,a>b,B>b A→(B | a (=B, (<A, (<(,(<a
运算法则: 1.乘除的优先大于加减 2.同优先级的运算符左大于右 3.括号内的优先级大于括号外
于是: 4+8-6/2*3 运算过程和结果唯一。 12
例: G[E] E→E+E | E*E | (E) | i
Vt={+, *, (, ), i} 这是一个二义文法,要用算符优先法分析有该文法所确定的 语言句子。 如:i+i*i
算法 : 从优先关系构造优先函数 方法:
1. a∈VT∪{#},建立两个符号fa和ga; 2. 若a = b, 从fa至gb画一条弧;也从gb至fa画
一条弧
3. a,b ∈VT, 若a·>b,则从fa至gb画一条弧; 若a<·b,则从gb至fa画一条弧;
4. 若图中无环,则存在优先函数, f(a)和g(b)等于从fa 和gb出发所能到达的结点
26
(3)算符优先分析算法的实现.
先定义优先级,在分析过程中通过比较相邻 运算符之间的优先级来确定句型的“句柄”并进 行归约.
? 最左素短语
[定义] 素短语:文法G的句型的素短语是一个短 语,它至少包含有一个终结符号,并且除它自身 以外不再包含其他素短语.
31
步骤
1 2 3 4
句型
*
.> .>
<. <. .> .>
i
.> .>
.> .>
(
<. <. <. <. =
)
.> .>
.> .>
#
<. <. <. <.
3)矩阵元素空白处表示这两个终结符不能相邻,故没有优先关系
14
(2) 分析过程 i+i*i
ab
+
+
.>
*
.>
i
.>
.
(
.<
)
.>
#
<
算法:
当栈顶项(或次栈顶 项)终结符的优先级 大于栈外的终结符的 优先级则进行规约, 否则移进.
PROCEDBRE INSERT(A,b) IF NOT F[A,b] THEN BEGIN F[A,b]:=TRAE 把(A,b)推进S栈 /* b∈FIRSTVT(A) */ END
BEGIN {main} FOR 每个非终结符号A和终结符b DO F[A,b]:=FALSE /*赋值符*/ FOR 每个形如A::=b…或A::=Bb… 的规则 DO INSERT(A,b)
E→E+E | E*E | (E) | i
步骤 1 2 3 4 5 6 7 8 9 10 11
*
i
(
)
#
<.
<.
<.
.>
.>
.>
<.
<.
.>
.>
.> . <.
. . <
.
.>
<.
. =.
.> .
>.
>
>
<
<
<
符号栈 # #i #E #E+
#E+i #E+E #E+E* #E+E*i #E+E*E #E+E #E
(1) 先确定终结符之间的优先关系
优先关系的定义:
设 a, b 为可能相邻的终结符
定义: a =. b
a的优先级等于b
a<. b
a的优先级小于b
a .> b
a的优先级大于b
13
2)例中文法终结符之间的优先关系可以用一个矩阵M来表示
b(右栈外) +
a(右栈内)
+
.>
*
i
(
)
#
<. <. <. .> .>
#T+T*F+i# #T+T+i# #E+i# #E+F#
关系
最左子串 规约符号
#<.+<.*>. +<.i.># T*F
T
#<.+>. +<.i.># T+T
E
#<. +<.i.>#
i
F
#<. +.>#
E+F
E
可以看出: 1. 每次规约最左子串,确实是当前句型的最左素短语 (语法树) 2. 规约的不都是真句柄(仅i规约为F是句柄,但它 是最左短语) 3. 没有完全按规则进行规约,因为素短语不一定是简 单短语
输入串 i+i*i# +i*i# +i*i#
Βιβλιοθήκη Baidui*i# *i# *i#
i# # # # #
优先关系 动作
#<i 移进
i>+ 规约
#<+ 移进
+<i 移进
i>* 规约
+<* 移进 *<i 移进 i># 规约 *># 规约
+># 规约 接受 15
算符优先文法(OPG)的定义
设有一OG文法,如果在任意两个终结符之间, 至多只有 上述关系中的一种,则称该文法为 算符优先文法(OPG)
35
优先函数
为了节约存储空间和便于执行比较运算?,用两 个优先函数f和g,它们是从终结符号映射到整数 的函数。对于终结符号a和b选择f和g,使之满足:
1. 当a=b时, f(a)= g(b); 2 .当a<·b时, f(a)<g(b); 3. 当a·>b时, f(a)> g(b)。 于是a和b之间的优先关系可以由比较f(a)与 g(b)的大小来决定。
B →Aa) A=a,a=),B>a,a>a,)>a
Sb A( Ba ) #
S
>
b
=<
<
>
A
=
=
(
<<=<
B
>
>
a
>
>=
)
>
>
#<<
=
6.3 算符优先分析(OperatorPrecedence Parsing)
1) 这是一种经典的自底向上分析法,简单直观,并被广泛使 用。
2) 称为算符优先分析是因为这种方法是仿效算术式的四则运算 而建立起来的,作算术式的四则运算时,为了保证计算结果 和过程的唯一性,规定了一个统一的四则运算法则,规定运 算符之间的优先关系。
6.1 自底向上分析
基本算法思想: 若采用自左向右的描述和分析输入串,那么自
底向上的基本算法是: 从输入符号串开始,通过重复查找当前句型的
句柄(最左简单短语),并利用有关规则进行规约, 若能规约为文法的识别符号,则表示分析成功,输 入符号串是文法的合法句子,否则有语法错误。
1
例:G[S]: S→aAcBe A→b A→Ab B→d 输入串为abbcde,检查是否是该文法的合法句子。
对于OG算法的几点说明:
1) 运算是以中缀形式出现的 2) 可以证明,若文法为OG文法,则不会出现 两个非终结符相邻的句型。 3) 算法语言中的表达式以及大部分语言成分 的文法均是OG文法
20
具体方法如下:
设一个栈S和一个二维布尔数组F F[A,b]=TRAE iff b∈FIRSTVT(A)
若采用自底向上分析,即能否一步步规约当前句型的句柄, 最终规约到识别符号S。先设立一个符号栈,我们统一符号 “#”作为待分析的符号串的左右分界符。 作为初始状态,先将符号串的分界符推进符号栈,作为栈底 符号。
分析过程如下表:
5
S→bAb b=A, A=b ,b<(,b<a,)>b,a>b,B>b A→(B | a (=B, (<A, (<(,(<a