第6章 自顶向上优先分析法

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2、算符优先文法定义
是一个不包含空串产生式的算符文法, 设G是一个不包含空串产生式的算符文法, 是一个不包含空串产生式的算符文法 并设a, ∈ 定义关系: 并设 ,b∈VT; P,Q,R ∈VN,定义关系: , , 1)a b 当且仅当 中含有形如 → …ab…产生 当且仅当G中含有形如 中含有形如P 产生 或者P 产生式; 式,或者 → …aQb…产生式; 产生式 2)a b 当且仅当 中含有形如 → …aR…的产生 当且仅当G中含有形如 中含有形如P 的产生 + 其中R + 式,其中 => b…, 或R => Qb…; 3)a> b 当且仅当 中有形如 →…Rb…产生式, 当且仅当G中有形如 中有形如P 产生式, 产生式 · + 其中R + 其中 => …a,或R =>…aQ. , 中任何终结符序偶( 若G中任何终结符序偶(a,b)至多满足上述关 中任何终结符序偶 ) 系之一,则称G为算符优先文法 为算符优先文法。 系之一,则称 为算符优先文法。
FIRSTVT(E’)={#} FIRSTVT(E)={+,*, ↑,(, , , ,(,i} FIRSTVT(T)= {*, ↑,(, , ,(,i} FIRSTVT(F)= {↑,(, ↑,(,i} FIRSTVT(P)= {(, (,i} (,
LASTVT(E’)={#} LASTVT(E)={+,*, ↑,),i} , , , LASTVT(T)={*, ↑,),i} , , LASTVT(F)={↑,),i} ↑ , LASTVT(P)={),i} ,
6.1 自底向上优先分析法概述
• 分类: 分类: 简单优先分析: 1、简单优先分析:对一个文法按一定原则 求出所有符号即终结符号和非终结符号之间的 优先关系,按照这种关系确定归约过程中的句柄. 优先关系,按照这种关系确定归约过程中的句柄. 特点:准确、规范,但分析效率底, 特点:准确、规范,但分析效率底,使用价值 不大. 不大. 算符优先分析:只规定算符(终结符号) 2、算符优先分析:只规定算符(终结符号) 之间的优先关系,不考虑非终结符号之间的优 之间的优先关系, 先关系,只要找到句柄就归约, 先关系,只要找到句柄就归约,不考虑归约到 那个非终结符号。 那个非终结符号。 特点:不是规范归约,分析速度快, 特点:不是规范归约,分析速度快,特别适 合于表达式的分析. 合于表达式的分析.
-,*不同级, -,*不同级,先归约右边 先括号内,后括号外 括号内, 归约括号内 归约括号对 先归约“ 先归约“*” 后归约“ 后归约“-”
一、算符文法的定义
1、给定上下文无关文法G,若G中所有产生式 给定上下文无关文法G 右部都不包含两个相继的非终结符, 右部都不包含两个相继的非终结符,则G为 算符文法。 算符文法。 注:算符文法保证了两个运算符之间只有一个 操作数。 操作数。
栈 # #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S 成功
G[S]: (1)S →aAcBe ( 2) A → b (3)A →Ab ( 4) B → d
输入串 abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
EΒιβλιοθήκη Baidu
• 两个算符之间的优先关系 是有序的,允许有a · 是有序的,允许有 >b, b> a同时存在,而不允许 同时存在, · 同时存在 · 有a b ,a >b,a b三种 三种 情况之两种同时存在。 情况之两种同时存在。
E * E E + E · + >*
三、算符优先文法及优先表的构造
1、各非终结符P的首终结符集和尾终结符集 、各非终结符 的首终结符集和尾终结符集 定义: 定义: 首终结符集FIRSTVT(P)= 首终结符集FIRSTVT(P)= + { a|P => a…或P => Qa…,a ∈VT; P,Q ∈VN} 或 + , 尾终结符集LASTVT(P)= 尾终结符集LASTVT(P)= +>… a或P +> … aQ,a ∈V ; P,Q ∈V } { a|P 或 ,
6.3
算符优先分析方法
一、基本思想 1、自下而上归约 规定算符(更一般地说,指终结符) 2、规定算符(更一般地说,指终结符)的优先 级及结合规则, 级及结合规则,以使得分析过程唯一 3、比较相邻两个算符而决定动作 1)关键是对所有算符定义某种优先关系 注:1)关键是对所有算符定义某种优先关系 2)算符优先分析法是仿效四则运算的计算 2)算符优先分析法是仿效四则运算的计算 过程而构造的一种语法分析方法
例: E →E+E|E-E|E*E|E/E|(E)|i i+i-i*(i+i)归约过程如下: 归约过程如下: 归约过程如下 i+i-i*(i+i) E+i-i*(i+i) E+E-i*(i+i) ” E-i*(i+i) E-E*(i+i) “ *” E-E*(E+i) E-E*(E+E) E-E*(E) E-E*E E-E 设算量级别最高,最先归约; 设算量级别最高,最先归约; +,-同级,先归约左边“ +,-同级,先归约左边“+ 同级
3)
0. E’->#E# 1. E→E+T|T → 2. T →T*F|F 3. F →P↑F|P ↑ 4. P →(E)|i
关系:对表达式文法中终结符在前,非终结 关系:对表达式文法中终结符在前, 符在后的相邻符号对有: #E, 符在后的相邻符号对有: #E,+T, *F, FIRSTVT(非终结符) ↑F,(E 终结符 FIRSTVT(非终结符) 关系:对表达式文法中终结符在后, 关系:对表达式文法中终结符在后,非终结 符在前的相邻符号对有: E# ,E+, T*, 符在前的相邻符号对有: P↑,E) LASTVT(非终结符) LASTVT(非终结符) 终结符 非终结符
[例]考虑下面文法: 考虑下面文法: 0. E’→#E# 1. E→E+T|T 2. T→T*F|F 3. F→P↑F|P ↑ 4. P→(E)|i • 解:1) 关系: 关系:#
构造优先关系表 # ,( )
•2)计算每个非终结符的FIRSTVT和LASTVT集合 )计算每个非终结符的 和 集合
FIRSTVT(E’)={#} FIRSTVT(E)={+,*, ↑,(,i} , , ,(, FIRSTVT(T)= {*, ↑,(, , ,(,i} FIRSTVT(F)= {↑,(, ↑,(,i} FIRSTVT(P)= {(, (,i} (, LASTVT(E’)={#} LASTVT(E)={+,*, ↑,),i} , , , LASTVT(T)={*, ↑,),i} , , LASTVT(F)={↑,),i} ↑ , LASTVT(P)={),i} ,
4)
5) 优先关系表 + ⋅> ⋅> ⋅> ⋅> <⋅ ⋅> <⋅ * ↑ <⋅ <⋅ ⋅> <⋅ ⋅> <⋅ ⋅> ⋅> <⋅ <⋅ ⋅> ⋅> <⋅ <⋅ <⋅ <⋅ <⋅ <⋅ <⋅ i ( <⋅ ⋅> <⋅ ⋅> <⋅ ⋅> ⋅> <⋅ =⋅ ⋅> <⋅ ) ⋅> ⋅> ⋅> ⋅> ⋅> =⋅ #
第六章 自底向上优先分析方法
• 教学要求:掌握算符优先分析法的关系表 教学要求: 的构造以及分析过程, 的构造以及分析过程,了解简单优先分折 法。 • 教学重点:归约,算符优先表构造。 教学重点:归约,算符优先表构造。
自底向上分析法的基本思想
• 从输入串开始,朝着文法的开始符号进 从输入串开始, 行最左归约, 行最左归约,直到到达文法的开始符号 为止。 为止。 • 工作方式:“移进-归约”方式。 工作方式: 移进-归约”方式。
• 用语法树来理解更直观
a
A …a θ b…
b
a
A
b
· a >b A … B b… P …a θ
…a B … P θ b…
注意
•表达式文法: 表达式文法: 表达式文法 E →E+E|E*E| (E)|i 是算符文法, 是算符文法,但不是算 符优先文法。 符优先文法。
E E + E E * E
+
*
例如: 例如:
有文法如下 (1)S→aAcBe aAcBe (2)A→b b (3)A→Ab Ab (4)B→d d 语句abbcde是不是该文法的合法语句? abbcde是不是该文法的合法语句 问:语句abbcde是不是该文法的合法语句?
移进归约的分析过程
步骤 0 1 2 3 4 5 6 7 8 9 10 11
=
=
T
N
有了这两个集合, 注:有了这两个集合,就可通过检查每个产生式 的每个候选式, 的每个候选式,确定满足关系 和 的所有终结 符序偶。 符序偶。
构造首终结符集和尾终结符集 首终结符集和尾终结符集算法 2、构造首终结符集和尾终结符集算法 1)构造集合FIRSTVT(P)的算法 构造集合FIRSTVT(P) 1)构造集合FIRSTVT(P)的算法 根据FIRSTVT(P)的定义,按下面的规则来构造: FIRSTVT(P)的定义 根据FIRSTVT(P)的定义,按下面的规则来构造: (1)若有产生式 若有产生式P a 或 Qa…, (1)若有产生式P→a…或P→Qa , Qa 则a∈FIRSTVT(P) (2)若 FIRSTVT(Q),且有产生式P Q , (2)若a∈FIRSTVT(Q),且有产生式P→Q…, 则a∈FIRSTVT(P) 2)构造LASTVT(P)的算法 构造LASTVT(P)的算法。 2)构造LASTVT(P)的算法。 根据LASTVT的定义,按下面的规则来构造: 根据LASTVT的定义,按下面的规则来构造: LASTVT的定义 (1)若有产生式P (1)若有产生式P→…a或P→…aQ , 若有产生式 a aQ 则a∈LASTVT(P) (2)若 LASTVT(Q) 且有产生式P (Q), (2)若a∈LASTVT(Q),且有产生式P→…Q , Q 则a∈LASTVT(P)
分析程序模型
a+b……#
语法分析程序 语法表 输出带
#
1)初态时栈内仅有栈底符“#”,读头指针在最左单词符 初态时栈内仅有栈底符“ 号上。 号上。 语法分析程序执行的动作: 2)语法分析程序执行的动作: 读入一个单词并压入栈内,读头后移; a)移进 读入一个单词并压入栈内,读头后移; 检查栈顶若干个符号能否进行归约,若能, b)归约 检查栈顶若干个符号能否进行归约,若能, 就以产生式左部替代该符号串,同时输出产生式编号; 就以产生式左部替代该符号串,同时输出产生式编号; 移进- c)识别成功 移进-归约的结局是栈内只剩下栈底符 号和文法开始符号,读头也指向语句的结束符; 号和文法开始符号,读头也指向语句的结束符; d)识别失败
3)构造算符优先表的算法 3)构造算符优先表的算法 每条产生式P X FOR 每条产生式P→X1X2…Xn DO X i=1,i<=nFOR( i=1,i<=n-1,i++) {if Xi和Xi+1均为终结符 then 置Xi Xi+1 ; i<=nif i<=n-2 and Xi和Xi+2均为终结符 and Xi+1 为非终结符 then 置Xi Xi+2 ; 为终结符而X if Xi为终结符而Xi+1为非终结符 then 中的每个a {置 for FIRSTVT(Xi+1)中的每个a DO {置Xi a} 为非终结符而X if Xi为非终结符而Xi+1为终结符 then 中的每个a {置 for LASTVT(Xi)中的每个a DO {置a Xi+1} } 如果文法G按此算法构造出的优先表没有重定义项, 注:如果文法G按此算法构造出的优先表没有重定义项, 则文法G是个算符优先文法。 则文法G是个算符优先文法。
输出带
动作 移进 移进 归约 移进 归约 移进 移进 归约 移进 归约 接受
2 2,3
2,3,4 2,3,4,1
遇到的问题: 遇到的问题: (1)如何找出进行直接归约的简单短 语? (2)找出的简单短语应直接归约到哪 一个非终结符? 一个非终结符? 关键: 关键: 确定句柄. 确定句柄. 常用的分析方法: 常用的分析方法: 优先分析和LR LR分析 优先分析和LR分析
相关文档
最新文档