第6章 自底向上语法分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
E E + T F i
E
T
+
T
T * F
编译原理
2012年7月5日
15
6.2
算符优先分析法
一种经典的自底向上分析法,简单直观, 适于表达式的分析 仿照算术表达式的四则运算过程 基本思想:将句型中的终结符当作“算符”,规定算符 之间的优先关系,通过比较相邻算符的优先次序来确定 句型的可归约串并进行归约。 1.乘除的优先大于加减 2.同优先级的运算符左大于右 3.括号内的优先级大于括号外
编译原理
2012年7月5日
2
教学内容
6.1 自底向上分析法 6.2 算符优先分析法
编译原理
2012年7月5日
3
6.1
自底向上分析法
G[<无符号整数>] <无符号整数> → <数字串> <数字串> → <数字串> <数字> | <数字> <数字> →0 | 1 | 2 | 3 | …… | 9
规范规约与规范推导互为逆过程 [<无符号整数>] <无符号整数> ==> <数字串> ==> <数字串> <数字> <数字> 0 ==> 10 ==> <数字串> 0
编译原理
2012年7月5日
10
2. 句柄
任一句型的最左简单短语称为该句型的句柄。 给定句型找句柄的步骤: 短语 简单短语 句柄
注意:短语、简单短语是相对于句型而言,一个句型
可能有多个短语、简单短语,句柄只能有一个。
编译原理
2012年7月5日
11
求句型T+T+i的句柄
E 短语:T+T+i, T+T, T, i 简单短语:T, i 句柄:T E T E + T +
21
×
编译原理
2012年7月5日
• 性质1:在OG中任何句型都不含有两个相邻 的非终结符; • 性质2:若Ab(bA)出现在OG的句型γ 中, 其中A ∈ VN,b ∈ VT,则γ 中任何含此b的 短语都必含有A。
编译原理
2012年7月5日
22
优先关系的定义 设G是一个算符文法,A、B、C是非终结符,a、b是终结符,则 算符优先关系定义为: . 1)a= b . 2)a<b 3)a. b > if文法中有形如 A→ ·ab ·或A→ · aBb · · · · · · · · · + + if文法中有形如 A→ · aB · ,其中B b ·或B Cb · · · · · · · · · +· if文法中有形如 A→ · Bb ·, 其中B · a或B+·aC · · · · · · ·
<数字串>
<数字串> <数字>
==> <数字> 0
1
编译原理
2012年7月5日 4
【例6.1】G[S]: S a P c Q e P b PPb Qd 分析句子abbcde#
编译原理
2012年7月5日
5
文法G[S]: (1) S → aPcQe (2) P → b (3) P → Pb (4) Q → d
算符优先文法的定义 设有一不含有ε产生式的OG文法,如果在任意两个终结符之间, 至多只有上述关系中的一种成立,则称该文法为算符优先文法
编译原理
2012年7月5日
23
例 G[E]: E→E+E|E*E |(E) |i E→E+T| E-T|T T→T*F| T/F|F F→(E)|i
×
编译原理
√
24
编译原理
31
2012年7月5日
注意:出现在aj左端和a i右端的非终结符号一定属于 这个素短语,因为我们的运算是中缀形式给出 的(OPG文法的特点)NaNaNaN NaWaN 例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i
分析文法的句型T+T*F+i
编译原理
2012年7月5日
构造优先分析表
编译原理
2012年7月5日
28
. • ①求 = 关系;
• ②求firstvt集和lastvt集; . • ③求 < 关系:列出所有产生式中终结符在前,非
终结符在后的所有相邻符号对;
• ④求 .>关系:列出所有非终结符在前,终结符在
后的所有符号对;
• ⑤根据所求,画出优先关系表。
编译原理
编译原理
2012年7月5日
33
算符优先分析算法描述 k=1,s[k]=‘#’ ;//s为符号栈,‘#’压入栈,s[k]为栈顶项 do{ a=getsym( );//读入下一个符号给a if(s[k] ∈VT ) j=k; else j=k-1; while(s[j] > a){ do{//在栈中寻找满足的s[j] < s[j+1]=…= s[k] > a 的s[j+1] , 即最左素短语的头 Q= s[j] ; if(s[j-1] ∈VT ) j=j-1; else j=j-2; }while(s[j] =Q) s[j+1]… s[k] N; //归约最左素短语 k=j+1; s[k]=N;}//end of while if(s[j] < a|| s[j] = a){k=k+1;s[k]=a;} //移进 else error }while(a!=‘#’ || 符号栈中不是#S) 34
编译原理
2012年7月5日
26
. < ”、“ .>” •求“
对形如A→…aB…的产生式,则对b∈FIRSTVT(B)有: a<b . 对形如A→…Bb…的产生式,则对a∈LASTVT(B)有: a. b >
编译原理
2012年7月5日
27
优先关系表的构造算法
步骤如下:
. . > 求该文法中的 = < . 关系
归约(Q→d)
移进 归约 接受
9) #aPcQ 10) #aPcQe 11) #S
P
a b b c d e
6 S aPcQe理 aPcde aPbcde abbcde 编译原 2012年7月5日
基本思想
从输入符号串开始,通过重复查找当前句型的 “可归约串”并利用有关规则进行规约 若能规约为文法的识别符号,则表示分析成功,输 入符号串是文法的合法句子,否则有语法错误.
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i T F i
编译原理
2012年7月5日
12
3. 素短语
素短语是一个短语,它至少包含有一个终结符号,并且除它 自身以外不再包含其他素短语.其中最左边的素短语称为 最左素短语。 短语:T+T+i, T+T, T, i 简单短语:T, i 句柄:T 素短语: T+T和i 最左素短语: T+T E E E + T + T F i
E∷=E+E|E-E|E*E|(E)|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
设有OPG文法句型为: #N1a1N2a2…NnanNn+1# 其中Ni为非终结符(可以为空), ai为终结符
定理:一个OPG句型的最左素短语是描述下列条件的最左子串: aj-1Njaj…NiaiNi+1 aj-1<aj aj=aj+1, aj+1= aj+2 ,…, ai-2= ai-1,ai-1= ai ai> ai+1
编译原理
2012年7月5日
16
分析器的逻辑结构:优先关系表、分析栈、总控程序
a1 a2 a3 … ai … an#
文法符号
X1
优先关系表
总控程序
… Xn-1 Xn
#
编译原理
2012年7月5日
17
【例6.3】 G[E]
E∷=E+E|E*E|(E)|i 优先关系的定义: 设a,b为可能相邻的终结符 定义: a . b a的优先级等于b a b a的优先级小于b a b a的优先级大于b 不同于数学中的=、<、>,不存在对称关系
=. <
. >
编译原理
2012年7月5日
18
E∷=E+E|E*E|(E)|i 6.2.1 优先关系表(算法的核心)
+
*
i
(
)
#
+
* i ( )
>
> > < >
<
> > < >
<
< <
<
< <
>
> > = >
>
> > >
#
<
编译原理
<
<
<
空白处表示这两个终结符不能相邻,故没优先关系
2012年7月5日 19
编译原理
2012年7月5日
25
【例6.4】试构造FIRSTVT集和LASTVT集
E'→#E# E→E+T E→T T→T*F T→F F→(E) F→i
方法:根据定义
FIRSTVT(E')={#} FIRSTVT(E)={+,*,i,(} FIRSTVT(T)={*,i,(} FIRSTVT(F)={i,(} LASTVT(E')={#} LASTVT(E)={+,*,i,)} LASTVT(T)={*,i,}} LASTVT(F)={i,)}
32
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i 步骤 1 2 句型 #T+T*F+i# #T+T+i# 关系 #<+<*>+<i># #<+>+<i># 最左子串 规约符号 T*F T+T T E
3 4
#E+i# #E+F#
#<+<i># #<+>#
i E+F
F E
编译原理
2012年7月5日
7
关键:找出当前句型的“可归约串x”
最左素短语 算符优先分析法
wenku.baidu.com
句柄
LR分析法
编译原理
2012年7月5日
8
1.短语和简单短语
给定文法G[S], δ为该文法的句型, + * 若 S==>Aδ,且A==>, 则是句型δ相对于A的短语; * 若 S==> Aδ, 且A==> , 则是句型δ相对于A的简单短语。 直观理解:短语就是某句型中的子串,这个子串是由某个非 终结符通过至少一步推导得到的子串,而简单短语就是由某 个非终结符通过一步推导得到的子串。 从语法树找句型的短语和简单短语 设A是句型αβδ的某一子树的根,其中β是形成此子树的末端 结点的符号串,则β是短语。若这个子树只有一层分支(称 简单子树),则β简单短语。
步骤 符号栈
1) 2) 3) 4) 5) 6) 7) # #a #ab #aP #aPb #aP #aPc
输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de#
动作
移进 移进 归约(P→b) 移进 归约(P→Pb) 移进 移进
S P Q
8)
# aPcd
e#
e# # #
T
编译原理
2012年7月5日
13
课堂练习:分别求句型E+i、E+F的短语、 简单短语、句柄、素短语、最左素短语
E E + T F i 短语:E+i, i 简单短语: i 句柄:i 素短语:i 最左素短语:i
编译原理
E E + T F
例: 文法G[E] E→E+T|T T→T*F|F F→(E)|i
编译原理
2012年7月5日
9
求句型T+T+i的短语、简单短语
E 短语:T+T+i, T+T, T, i 简单短语:T, i E T E + T +
例: 文法G[E] E::=E+T|T T::=T*F|F F::=(E)|i T F i
设A是句型αβδ的某一子树的根,其中β是形成此子树的末端 结点的符号串,则β是短语。 若这个子树只有一层分支,则β是简单短语。
2012年7月5日
29
【例6.5】试构造例6.4中文法G[E']的优先关系表。
可根据优先关系表判断该文法是否为算符优先文法 如果表中元素不存在冲突,即文法的任何终结符至 多只存在一种优先关系,则该文法是一个算符优先 文法
表6.5
编译原理
2012年7月5日
30
6.2.4 算符优先分析法如何确定当前句型的最左素短语?
短语:E+F, F 简单短语:F 句柄:F 素短语: E+F 最左素短语: E+F
2012年7月5日 14
【例6.2】求句型T+T*F+i的短语、简单短语、
句柄、素短语、最左素短语
例: 文法G[E] E→E+T|T T→T*F|F F→(E)|i
短语:T+T*F+i, T+T*F, T,T*F,i 简单短语:T,T*F,i 句柄:T 素短语:T*F和i(因为T不包含终 结符, T+T*F+i和T+T*F包含其他素 短语) 最左素短语:T*F
2012年7月5日
6.2.3 算符优先关系表的构造 . •求 “ =” 检查每一条规则,若有A→ …ab…或 A→…aBb…, . 则 a =b . < ”、“ .> ”,复杂一些,需定义两个集合 •求“
+ + FIRSTVT( B )={b|Bb…或BCb…,b∈VT, C∈VN}
+ + LASTVT( B )={b|B…b或B…bC,b∈VT, C∈VN}
编译原理
20
2012年7月5日
6.2.2 算符优先文法 算符文法的定义 若文法中没有形如A→ ··· BC ···的规则,这里B,C∈VN 则称G为算符文法(OG文法) 算法语言中的表达式文法均可以表示为算符文法 例
G[E]: E→E+E|E*E |(E) |i
√
G[E]: E→EAE|(E)|i A→+|*
S.P 词法分析程序 符 号 表 管 理
语法分析程序
语义分析、生成中间代码 代码优化
错 误 处 理
生成目标程序 O.P
编译原理
2012年7月5日
1
第6章
自底向上语法分析
教学目标
1. 2. 3. 4. 要求明确语法分析在编译过程所处的阶段和作用。 明确语法分析的基本分析方法。 掌握算符优先分析的方法。 掌握构造算符优先分析表的方法,会使用算符优先分 析表分析句子。