编译原理第06章-自底向上优先分析法

合集下载

第6章 自底向上优先分析(10月14日修改)

第6章 自底向上优先分析(10月14日修改)
第6章 自底向上优先分析
第6章 自底向上优先分析法
学习目标:
掌握:构造算符优先关系表,进行算符 优先分析,构造优先函数 理解:算符优先文法,最左素短语
了解:简单优先分析法
Page 2
第6章 自底向上优先分析
2013-7-5
第6章 自底向上优先分析法
6.1 自底向上分析方法概述
6.2 自底向上优先分析方法概述
2013-7-5
6.1 自底向上分析方法概述
关键问题:如何在分析的过程中确定句柄
何时移进?栈顶未形成句柄 何时归约?栈顶形成句柄
常用自底向上分析法:
算符优先分析法(6.3)
LR类分析法(第7章)
Page 8
第6章 自底向上优先分析
2013-7-5
6.2 自底向上优先分析法概述
3.基本实现方法——“移进-归约”方法
引进一个先进后出的符号栈来存放符号; 对输入符号串自左向右进行扫描,并把当前输入符号下推 入栈中(移进),边移进边分析,一旦栈顶符号串形成某 个句型的句柄(为某产生式的右部)时,就用相应的非终 结符(产生式的左部)替换它(归约)。 重复这一过程,直到输入符号串的末端,此时如果栈中只 剩文法开始符号,则输入符号串是文法的句子,否则不是。
Page 4 第6章 自底向上优先分析 2013-7-5
6.1 自底向上分析方法概述
规范归约:
自底向上分析的移进-归约过程是自顶向下最右 推导的逆过程。而因为最右推导为规范推导,所以自 左向右的归约称为规范归约。
例 文法: (1) S→aAcBe (3) A→Ab (2) A→b (4) B→d
T→T×F|F
F→(E)|i
Page 26 第6章 自底向上优先分析 2013-7-5

编译原理自底向上优先分析法

编译原理自底向上优先分析法

其他领域中的应用实例
形式语言理论
自底向上优先分析法在形式语言理论中可用于研究语言的性质和结构,如文法分类、自动机理论等。
人工智能
自底向上优先分析法在人工智能领域中可用于知识表示、推理和问题求解等方面,如专家系统、智能 规划等。
06 总结与展望
总结
01
优先分析法是一种编译原理中的语法分析方法,它按照一 定的优先级规则,从左到右、从底向上地构建语法树。这 种方法在编译器设计中具有广泛的应用,能够有效地处理 表达式的语法和语义问题。
其他领域
除了编译器设计和自然语言处理领域,自底向上 优先分析法还可以应用于其他需要处理和分析语 法结构的领域。
03 自底向上优先分析法实现
构建抽象语法树(AST)
抽象语法树(AST)是源代码的抽象 语法结构的树状表现形式,树上的每 个节点都表示源代码中的一种结构。
在构建AST时,需要遵循源代码的语 法规则,将源代码中的各个元素(如 变量、操作符、语句等)按照其语法 关系组织成树状结构。
02
自底向上优先分析法是优先分析法的一种,它从输入的字 符串开始,逐步向上构建语法树,直到达到抽象语法树的 根节点。这种方法在处理复杂的表达式时具有较高的效率 和准确性。
03
优先分析法在编译原理中具有重要的地位,它不仅能够帮 助编译器正确地处理表达式的语法和语义问题,还能够提 高编译器的性能和可维护性。
语义分析
对AST进行语义检查,确保代码符合 语言的语义规则。
中间代码生成
将AST转换成中间代码,通常是三地 址码。 Nhomakorabea代码优化
对中间代码进行优化,提高执行效 率。
代码生成
将中间代码转换成机器码,生成可 执行文件。

第六章 自底向上优先分析法

第六章 自底向上优先分析法

练习:若有句型#abAbEcaEc#,则以下哪些可能是句柄() ab abA bAb bAbE ca caE aEc
定义6.2 设G是一个算符文法,a和b是任意两个终结符,A、 B、C是非终结符,算符优先关系=、<、>定义如下: · · · (1)a=b 当且仅当G中含有形如 A … ab …或 A … aBb … · 的产生式。 · (2)a<b 当且仅当G中含有形如 A …aB …的产生式,且 B + b… 或B + Cb… (3)a>b 当且仅当G中含有形如 A …Bb …和产生式,且 · B + …a 或B + …aC A A A …B b… … a B… …a δ b… P P δ b … … a δ
优先分析方法 简单优先分析方法 算符优分析方法 1、简单优先分析方法:对一个文法按一定原则求出该文 法所有符号即终结符和非终结符之间的优先关系,按 照这种关系确定归约过程中的句柄,它的归约过程实 际上是一种规范归约。 2、算符优先分析方法:只规定算符之间的优先关系,也 就是只考虑终结符之间的优先关系,由于算答优先分 析不考虑非终结符之间的优先关系,在归约过程中只 要找到句柄就归约,并不考虑归约到哪个非终结符名, 因而算符优先归约不是规范归约。
第六章 自底向上优先分析法
• 实现思想:对输入符号串自左向右进行扫描,并将输 入符逐个移入一个后进先出栈中,边移入边分析,一 旦栈顶符号串形成某个句型的句柄时,(该句柄对应 某产生式的右部),就用该产生式的左部非终结符代 替相应右部的文法符号串,这称为一步归约。重复这 一过程直到归约到栈中只剩文法的开始符号时则为分 析成功。 • 自底向上分析的移进—归约过程是自顶向下最右推导 的逆过程,也称为规范归约。

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

第6章自底向上优先分析法
第6章 自底向上优先分析法
6.1 概述
原理:在采用自左向右扫描,自底向上分析的前提下,该类 分析方法是从输入符号串入手,通过反复查找当前句 型的句柄(最左简单短语),并使用文法的产生式把 句柄归约成相应的非终结符来一步步地进行分析的。 最终把输入串归约成文法的开始符号,表明分析成功。 所以,任何自底向上分析方法的关键就是要找出当前 句型的句柄,然后根据产生式判别将它归约成什么样的非 终结符号。
解:归约过程见分析过程串为E+E,若只从移进-归 约的角度讲,栈顶已出现了产生式(1)的右部,可以进行归约, 但从通常四则运算的习惯来看应先乘后加,所以应移进,这就 提出了算符优先的问题。
例6.5:下面给出一个表达式的文法为: E→E+E|E-E|E*E|E/E|E↑E|(E)|i
(
a )
. <
=
. < . <
. >
. >
. >
. >
=
.
Z bM b
( L Ma )
构造优先矩阵的一种简便方法:
STEP 1 对每个非终极符W求下面两种集合: + HEAD(W)= {S︱W S…,S∈(VNUVT)} + LAST(W)={S︱W …S,S∈(VNUVT)} STEP 2 对每个符号对Si,Sj填写优先关系矩阵元素(其中W,V∈VN): M[Si,Sj]= ﹒ = ,如果有U→ … SiSj …
这种方法的基本思想为: 首先规定文法符号之间的优先关系,然后再利用这种关系, 通过比较句型中两个相邻的符号之间的优先关系来确定句型的 “句柄”并进行归约。
二、相邻关系:
设Si和Sj是文法G的任意两个符号,那么它们在句型中可相 邻出现的充要条件是必须满足下列条件之一:

第06章 自底向上优先分析

第06章 自底向上优先分析

第6 章自底向上优先分析第1 题已知文法G[S]为:S→a|∧|(T)T→T,S|S(1) 计算G[S]的FIRSTVT 和LASTVT。

(2) 构造G[S]的算符优先关系表并说明G[S]是否为算符优先文法。

(3) 计算G[S]的优先函数。

(4) 给出输入串(a,a)#和(a,(a,a))#的算符优先分析过程。

答案:文法展开为:S→aS→∧S→(T)T→T,ST→S(1) FIRSTVT - LASTVT 表:(2) 算符优先关系表:表中无多重人口所以是算符优先(OPG)文法。

友情提示:记得增加拓广文法S`→#S#,所以# FIRSTVT(S),LASTVT(S) #。

(3)对应的算符优先函数为:a(),^# f212221g331131(4)对输入串(a,a)#的算符优先分析过程为Success!对输入串(a,(a,a))# 的算符优先分析过程为:第 2 题已知文法 G[S]为: S →a|∧|(T)T →T ,S|S(1) 给出(a,(a,a))和(a,a)的最右推导,和规范归约过程。

(2) 将(1)和题 1 中的(4)进行比较给出算符优先归约和规范归约的区别。

答案:(1)(a,a)的最右推导过程为: S (T) (T,S)(T,a) (S,a) (a,a)(a,(a,a))的最右推导过程为: S (T) (T,S) (T,(T))(T,(T,S))(T,(T,a))(T,(S,a))(T,(a,a))(S,(a,a))(a,(a,a))(a,(a,a))的规范归约过程:(a,a)的规范归约过程:(2)算符优先文法在归约过程中只考虑终结符之间的优先关系从而确定可归约串,而与非终结符无关,只需知道把当前可归约串归约为某一个非终结符,不必知道该非终结符的名字是什么,因此去掉了单非终结符的归约。

规范归约的可归约串是句柄,并且必须准确写出可归约串归约为哪个非终结符。

第3题:有文法G[S]:SÆVVÆT|ViTTÆF|T+FFÆ)V*|((1) 给出(+(i(的规范推导。

编译原理第六章-自底向上优先分析法PPT课件

编译原理第六章-自底向上优先分析法PPT课件
❖ 由定义直接构造 ❖ 由关系图法构造算符优先关系表
20
(1)由定义直接构造
❖ 首先引入两个概念
FIRSTVT(B)={b|B b…或B Cb...}
❖对于非终结符B,其往下推导所可能出现的首个算符
LASTVT(B)={a|B … a或B ... aC}
>
>
11) #S
>=
#
接受
)
>
>
对输入串b(aa)#的简单优先分析过程
#< <
简单优先关系矩阵
12
❖ 自底向上优先分析法慨述 ❖ 简单优先分析 ❖ 算符优先分析
13
6.3 算符优先分析法
❖ 某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别 和同一级别的结合性
(4)括号‘(’,‘)’的优先级大 / > > > > < < > < >
于括号外的运算符,小于括号 内的运算符,内括号的优先性
>>>><<><>
(<<<<<<=<
)>>>>>
>
>
大于外括号
i>>>>>
>
>
(5)#的优先性低于与其相邻的 # < < < < < < < =
算符
算符优先关系表
15
文法G[E]:E→E+E|E-E|E*E|E/E|EE|(E)|i

编译原理第六章-自底向上优先分析法

编译原理第六章-自底向上优先分析法
38
(E’, #)
39
40
+*^ i ( )#
E’
1
E11111
T
1111
F
111
P
11
FIRSTVT(E’) = {#} FIRSTVT(E) = {+, *, ^, i,(} FIRSTVT(T) = {*, ^, i,(} FIRSTVT(F) = { ^, i,(} FIRSTVT(P) = { i,(}
13
6.3 算符优先分析法
某些文法具有“算符”特性 表达式运算符(优先级、结合性) 人为地规定其算符的优先顺序,即给出优先级别 和同一级别的结合性
只考虑算符之间的优先关系来确定句柄
14
6.3.1 直观算符优先分析法
文法G[E]:E→E+E|E-E|E*E|E/E|EE|(E)|i
(1) 优先级最高,右结合
24
(P, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
25
(F, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
26
(T, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
27
(E, i) (P, () (F, ^) (T, *) (E, +) (E’, #)
S=>aAcBe=>aAcde=>aAbcde=>abbcde 由此我们可以构造它的逆过程即归约过程。
5
自底向上分析的关键问题: 如何确定句柄。
6
自底向上优先分析法慨述 简单优先分析 算符优先分析
7
6.2 简单优先分析法

自底向上优先分析法

自底向上优先分析法
01
例如:E+T*F。只需要知道*的优先级高于+,就可以知道T*F时句柄。
02
在一般的文法中,终结符的地位相当于操作符。
03
算符优先分析技术基本思想
01
定义6.4:如果文法中没有形状如
03
的规则,则该文法称为算符文法。
02
U::= VW
04
其中, U,V和W均为非终结符。
算符文法
定理6.6 如果TU出现在句型中,其中T为终结符,U为非终结符,那么包含T的短语也必然包含U.
简单优先技术只适应于简单优先文法。实际上,一般的程序设计语言的文法都不是简单优先文法。比如四则运算表达式的文法。
01
应用优先技术的困难与克服
识别过程:从左到右地扫描输入符号。已经扫描或归约得到的符号被存放在一个栈中。
01
每次扫描的时候,将当前符号a和栈顶符号S相比较。如果S ► a表示已经碰到了一个句柄的尾。然后在栈里面向前(下)找,直到找到句柄的头。此时找到右部为该句柄的规则进行归约。
b A b
a
S
b◄a a►b
b A b
S
( B
b◄ ( ( 〓B B►b
优先矩阵
可以将优先关系填写到一个矩阵,得到优先矩阵。(将矩阵作为关系的表示形式)
S
A
B
a
b
(
)
S
A
=
=
B


a


(

=


b
=


)


=
# b ( ( a a ) a ) b #
◄ ◄ ◄ ◄ ►
定理6.4的证明

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

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

第6章⾃底向上优先分析法⾃底向上分析⽅法,也称移进-归约分析法,粗略地说它的实现思想是对输⼊符号串⾃左向右进⾏扫描,并将输⼊符逐个移⼊⼀个后进先出栈中,边移⼊边分析,⼀旦栈顶符号串形成某个句型的句柄时,(该句柄对应某产⽣式的右部),就⽤该产⽣式的左部⾮终结符代替相应右部的⽂法符号串,这称为归约。

重复这⼀过程直到归约到栈顶中只剩⽂法的开始符号时则为分析成功,也就确认输⼊串是⽂法的句⼦。

本章将在介绍⾃底向上分析思想基础上,着重介绍算符优先分析法。

例6.1,设⽂法G[S]为:(1)S→aAcBe(2)A→b(3)A→Ab(4)B→d对输⼊串abbcde#进⾏分析,检查该符号串是否是G[S]的句⼦。

由于⾃底向上分析的移进-归约过程是⾃顶向下最右推导的逆过程,⽽最右推导为规范推导,⾃左向右的归约过程也称为规范归约。

容易看出对输⼊串abbcde的最右推导为:S aAcBe aAcde aAbcde abbcde由此我们可以构造它的逆过程即归约过程。

先设⼀个后进先出的符号栈,并把句⼦左括号”#”号放⼊栈底。

对上述分析过程也可看成⾃底向上构造语法树的过程,每步归约都是构造⼀棵⼦树,最后当输⼊串结束时刚好构造出整个语法树。

在上述移进-归约或⾃底向上构造语法树的过程中,考虑⼏个问题:u 何时移进?u 何时归约?u 将哪个字符串归约?当⼀个⽂法⽆⼆义性时,那么它对⼀个句⼦的规范推导是唯⼀的,规范规约也必然是唯⼀的。

因⽽每次归约时要找当前句型的句柄,也就是说,任何时候栈中的符号串和剩余的输⼊串组成⼀个句型,当句柄出现在栈顶符号串中时,则可⽤句柄归约,这样⼀直归约到输⼊串只剩结束符,⽂法符号栈中只剩开始符号。

由此可见,⾃底向上分析的关键问题是在分析过程中如何确定句柄,即如何知道何时在栈顶符号串中已形成某句型的句柄。

然⽽⾃底向上的分析算法很多,我们仅在本章和第7章介绍⽬前常⽤的算符优先分析和LR类分析法。

6.1 ⾃底向上优先分析法概述优先分析法⼜可分简单优先法和算符优先分析法。

编译原理自底向上优先分析课件

编译原理自底向上优先分析课件

CHAPTER 02
自底向上优先分析基础
文法和语言
定义
文法是描述语言的语法结构的形式化工具,由一组产生式构成。语言是文法产生的所有句 子的集合。
上下文无关文法
在编译原理中,常用上下文无关文法来描述程序设计语言的语法结构。这种文法的产生式 形式为A→β,其中A是非终结符,β是终结符和非终结符组成的字符串。
随着量子计算的快速发展, 如何设计适用于量子计算环 境的编译器成为一项迫切需 求。自底向上的优先分析方 法有望在量子计算环境下的 编译器设计中发挥重要作用。
跨平台和跨语言 支持
为了满足不同平台和语言的 需求,未来研究可以关注如 何使自底向上优先分析方法 更好地支持跨平台和跨语言 编译。
THANKS
CHAPTER 04
LALR分析算法
LALR分析表的构建
01
02
03
步骤一
步骤二
步骤三
构造文法的LR(1)分析表。LALR分析 算法首先会为给定的上下文无关文法 构造LR(1)分析表。该分析表包含了所 有可能的状态和对应的动作(移进、 规约或接受)。
合并同心集。在LR(1)分析表的基础上, LALR分析算法会识别并合并所谓的“ 同心集”(即具有相同闭包和goto函 数的项集)。这一步骤有效地减少了 状态的数量,从而使得分析表更小、 更简洁。
结构。该表根据当前分析状态和输入符号,指导归约操作的进行,提高
了分析效率。
本课件的内容和结构
主要内容
本课件将详细介绍自底向上优先分析方法的基本原理、归约过程、分析表的使用 以及相关的优化技术。通过实例和案例,展示这种方法在编译器设计中的应用。
结构安排
首先介绍编译原理概述和自底向上优先分析方法的基本原理,然后深入讲解归约 过程和分析表的使用,最后探讨相关的优化技术和应用案例。课件将结合理论和 实践,使读者更好地理解和掌握自底向上优先分析方法。

第六章自底向上优先分析法

第六章自底向上优先分析法

步骤 符号栈
1) # 2) #a 3) #ab 4) #aA 5) #aAb 6) #aA 7) #aAc 8) #aAcd 9) #aAcB 10) #aAcBe 11) #S
输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
动作
移进
移进
移进 移进 移进 归约 T int 归约T int * T 移进 移进 归约T int 归约E T 归约E T + E
短语、直接短语、句柄的定义review
文法G[S] SαAδ且Ab 则称b是句型αbδ相对于 非终结符A的短语。 若有A b则称b是句型αbδ相对于该规则 Ab的直接短语。 句柄(Handles):句型的最左直接短语
6.2 简单优先分析法
按照文法符号—终结符和非终结符的优先关 系确定句柄
确定优先关系 precedence relation 构造优先关系表 precedence table
6.2.1 优先关系
优先关系 precedence relation X ≡ Y 表示X和Y的优先关系相等


A


(
⋖⋖≡ ⋖
B


a

⋗≡
)

#⋖ ⋖


6.2.2 简单优先文法的定义
Simple precedence grammar 满足以下条件的文法是简单优先文法 (1) 在文法符号集V中,任意两个符号之间最多
只有一种优先关系成立。 (2) 在文法中任意两个产生式没有相同的右部 (3) 不含空产生式
In bottom-up parsing, you start with the string and reduce it to the start symbol by applying the productions backwards.

自底向上优先分析法

自底向上优先分析法
U
S0 Sj-1SjSj+1Sj+2 Si-1SiSi+1 Sn
优先关系
• 和书上的写法不一样。 等同:Si 〓 Sj 先于:Si ►Sj 后于:Si◄Sj
• 注意:〓,►和◄不同于=,>和<。 由Si►Sj不能导出Sj◄Si。
简单优先分析技术(思路续)
• 我们要通过两个相邻符号SiSi+1之间的关系来 找到句柄:
例子
不用此页
文法GE[E]: E::=E+E|E*E|(E) 输入符号串:i*i+i 已处理 未处理 句型 句柄
规则
i
*i+i
E *i+i
E* i+i
E*i +i
E*E +i
E
+i
E+i
E+E
E
i*i+i E*i+i E*i+i E*i+i E*E+i E+i E+i E+E
i E::=i
i E::=i E*E E::=E*E
+
TAIL (V)={Sl | V ==> Sl }
={ Sj1, Sj2, , Sjm }。
+
HEAD(W)={Sk | W ==> Sk}
Si1 Si2 Sin
={ Si1, Si2, , Sin }。
S
S
b Ab a
b◄a a►b
bA
b b◄ (
(
B ( 〓B
B►b
优先矩阵
• 可以将优先 关系填写到 一个矩阵, 得到优先矩 阵。(将矩阵 作为关系的 表示形式)

06 第六章 自底向上分析-优先分析法

06 第六章 自底向上分析-优先分析法

de# 规约(A→Abc)
de# 移进 e# 规约(B→d) e# 移进 # 规约(S→aABe) # 接收
6.1 自底向上分析法的概述
分析过程:
(1)符号栈:我们建立的这个符号栈是一个后进先出的栈,即 每次检查的都是位于栈顶的符号,通过观察栈顶的符号来判 断输入串分析过程中采取的动作。


符号进栈时每次只能移进一个符号;

6.3.1 优先关系的判断
1.优先关系符号及其含义
首先,我们给出优先关系的表示符号及其含义,如表6-2所示。 假设a和b是文法中任意的两个文法符号(可以为终结符号,也 可以为非终结符号),a和b是在文法的句型中可能会处在相邻 位置上的两个文法符号。下面我们给出三种优先关系的表示 符号:· >,<· (注意:· 和= >,<· 和=符号的含义和数学中的>, <和=符号的含义是不同的)。
(5)重复上述步骤(2)、(3)、(4)直到归约完输入符号串,栈中只 剩下文法的开始符号为止。
6.3.3 简单优先分析法
例6-1 设文法G为: S→aABe 步骤 A→Abc (1) A→b (2) B→d (3)
(4) (5) (6) (7) (8) (9) (10) (11)
表6-1 用移进-规约方法对输入串abbcde# 的分析过程
且B=>+Y…。
(3)若有X=Y,当且仅当G中存在产生式规则A→…XY…。 (4)增加语句括号“#”的优先级规则:“#”的优先级要<· 所有的 文法符号;而所有的文法符号·>“#”;但是在构造文法的符号优 先关系的时候只需要考虑与句子括号“#”可能相邻的文法符号。
6.3.1 优先关系的判断
例6-3 考虑文法G[S], 求该文法的优先关系。 →bAb (1) =关系 S b = A = b b = A A = b (= B A ( = B A=a a=) B A= a = ) A→(B A→a B→Aa)

编译原理第06章 自底向上优先分析法

编译原理第06章 自底向上优先分析法

自底向上分析方法概述



自底向上分析方法,也称移进-归约分析法。 实现思想是对输入符号串自左向右进行扫 描,并将输入符逐个移入一个后进先出栈 中,边移入边分析,一旦栈顶符号串形成 某个句型的句柄时,就用该产生式的左部 非终结符代替相应右部的文法符号串,这 称为一步归约。 重复这一过程直到归约到栈中只剩文法的 开始符号时则为分析成功,也就确认输入 串是文法的句子。 示例
直接计算算符优先关系

‘≖‘关系 直接看产生式的右部,若出现了 A→…ab…或A→…aBb,则a ≖b ’⋖‘关系


求出每个非终结符B的FIRSTVT(B) 若A→…aB…,则b∈FIRSTVT(B),a⋖b
求出每个非终结符B的LASTVT(B) 若A→…Bb…,则a∈LASTVT(B),a ⋗b


1:在算符文法中任何句型都不包含两个相邻的 非终结符。(归纳法) 2:如 Vx 或 xV 出现在算符文法的句型 中, 其中V∈VN,x∈VT, 则 中任何含 x 的短语必含 有V。(反证法)
用归纳法






设是句型,即S⇒* S=ω0 ⇒ω1 ⇒...⇒ωn-1 ⇒ωn= 推导长度为n,归纳起点n=1时, S=ω0⇒ω1= ,即S ⇒,必存在产生式S→,而由算符文法的 定义,文法的产生式中无相邻的非终结符,显然满足性质1。 假设n>1, ωn-1满足性质1。 若ωn-1= A,A为非终结符。 由假设知α的尾符号和δ的首符号都不可能是非终结符,否则 与假设矛盾。 又若A→是文法的产生式,则有 ωn-1 ⇒ωn== 而A→是文法的原产生式,不含两个相邻的非终结符,所以 也不含两个相邻的非终结符。满足性质1。证毕。

编译原理自底向上优先分析

编译原理自底向上优先分析

(E: 则有(<FIRSTVT(E)
(4)求>关系
E#: 则有LASTVT(E)>#
E+:则有LASTVT(E)>+
T*: 则有LASTVT(T)>*
P^:则有LASTVT(P)>^
E): 则有LASTVT(E)>)
23
(0)E’#E# (1) EE+T (2)ET
(3)TT*F
(4)TF (5)FP^F|P (6)P(E) (7)Pi
➢ 性质1:在算符文法中,任何句型都不包含两个 相邻的非终结符。
➢ 性质2:如果Ab或(bA)出现在算符文法的句型 中。其中,A为非终结符, b为终结符, 则句型中 任何含b的短语必含有A.
17
6.3.2 算符优先文法的定义
定义3 设有一个不含产生式的算符文法G,如果对任意两
个终结符对a、b之间至多只存在<、>、=三种关系中的
( (, ( a, ( A
(3)求 关系
由SbAb, A=>…), A=>…B, A=>a, 可得:
) b, a b, B b
由BAa), A=>…), A=>a, A=>…B,可得:
) a, a a, B a
8
增:S’#S#
例:文法G[S]:SbAb A(B|a BAa)
文法的简单优先关系矩阵
S b A(B a)#
B=+=>Y… (3)X Y:当且仅当存在规则A…BY…,且
B=+=>…X *
7
例:文法G[S]:SbAb A(B|a BAa)
分析优先关系:
(1)求 关系
b A, A b, ( B, A a, a )
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理之 优先分析法
华东交通大学软件学院 万仲保
2021/3/10
讲解:XX
1
第06章 自底向上优先分析法
❖自底向上优先分析概述 ❖简单优先分析法 ❖算符优先分析法
2021/3/10
讲解:XX
2
自底向上分析方法概述
❖ 自底向上分析方法,也称移进-归约分析法。
❖ 实现思想是对输入符号串自左向右进行扫 描,并将输入符逐个移入一个后进先出栈 中,边移入边分析,一旦栈顶符号串形成 某个句型的句柄时,就用该产生式的左部 非终结符代替相应右部的文法符号串,这 称为一步归约。
❖ 性质
➢ 1:在算符文法中任何句型都不包含两个相邻的 非终结符。(归纳法)
讲解:XX
5
优先关系的定义
❖ 优先关系
➢ X ≖Y:表示X、Y的优先关系相同,当且仅 当文法G中存在产生式A→...XY…;
➢ X⋖Y:表示X的优先性比Y的要低,当且仅当
文法G中存在产生式A→...XB...,且B
Y...
➢ X⋗Y:表示X的优先性比Y的要高,当且仅当
文法G中存在产生式A→...BD...,且B
...X,
D
*
Y
2021/3/10
讲解:XX
6
简单优先文法的定义
❖ 满足以下条件的文法是简单优先文法:
➢ (1)在文法符号集V中,任意两个符号之间最多 只有一种优先关系成立;
➢ (2)在文法中任意两个产生式没有相同的右部。
ห้องสมุดไป่ตู้
2021/3/10
讲解:XX
7
简单优先分析法——算法
❖ 根据已知优先文法构造相应优先关系矩阵,并将 文法的产生式保存,设置符号栈S,算法步骤如 下:
2021/3/10
讲解:XX
12
算符优先分析法
❖ 某些文法具有“算符”特性
➢ 表达式运算符(优先级、结合性);
➢ 人为地规定其算符的优先顺序,即给出优先级别和同一级别的结合性;
❖ 只考虑算符之间的优先关系来确定句柄。
❖ 定义
➢ 算符文法
➢ 算符优先关系
➢ 算法优先文法
➢ 最左素短语
❖ 算符优先关系表的构造
❖ 算符优先分析法概述
❖ 算符优先文法的性质
❖ 算符优先分析算法
❖ 优先函数
❖ 算符优先分析法的局限性
2021/3/10
讲解:XX
13
算符文法的定义
❖ 如果不含空产生式的上下文无关文法 G 中没 有形如 U…BC…的产生式,其中B, C∈VN,则称G为算符文法(Operater Grammar,OG)。
1. 将输入符号串a1a2a3...an#依次逐个存入符号栈 S中,直到遇到栈顶符号ai的优先性.>下一个 待输入符号aj时为止。
2. 栈顶当前符号ai为句柄尾,由此向左在栈中找 句柄的头符号ak,即找到ak-1⋖ak为止。
3. 由句柄ak...ai在文法的产生式中查找右部为ak...ai的产 生式,若找到则用相应左部代替句柄,若找不到则 为出错,这时可断定输入串不是该文法的句子。
讲解:XX
11
对输入串进行分析(输入串b(aa)b# )
文法G[S]: (1) S → bAb (2) A → (B|a
步骤
1) 2) 3)
符号栈
# #b #b(
(3) B → Aa)
4) #b(a
5) #b(A
6) #b(Aa
7) #b(Aa)
8)
S
S
bA
(
B
a
)
# ·>
9)
b
·= <·

·> 10)
2021/3/10
讲解:XX
9
确定文法符号之间的关系
1. 求≖关系: • 由(1):b ≖A A ≖b
• 由(2):(≖B • 由(3):A ≖a a ≖) 2. 求⋖关系:
• 由(1)(2):b⋖( b⋖ a
• 由(2)(3):(⋖ A (⋖( 3. 求⋗关系:
• 由(1):B ⋗b a ⋗b • 由(3):B ⋗a a ⋗a
最右推导:
S aAcBe 2021/3/10 aAcde 讲a解A:XbXcde abbcde 4
简单优先分析法
❖ 按照文法符号(包括终结符和非终结符)的 优先关系确定句柄。
❖ 定义
➢ 优先关系 ➢ 简单优先文法
❖ 优先关系矩阵:表示文法符号之间关系的矩阵。 ❖ 算法 ❖ 示例
2021/3/10
(⋖ a
) ⋗b ) ⋗a
2021/3/10
讲解:XX
10
求出文法的简单优先关系矩阵
SbA( Ba ) #
S
·>
b
·= <·

·>
A
·=
·=
(
<· <· ·= <·
B
·>
·>
a
·>
·> ·=
)
·>
·>
# <· <·
·=
“#”用来表示语句括号,其优先关系低于所有与其有相邻关系的文法符 号。
2021/3/10
❖ 重复这一过程直到归约到栈中只剩文法的 开始符号时则为分析成功,也就确认输入 串是文法的句子。
❖ 示例
2021/3/10
讲解:XX
3
示例 文法G[S]:
(1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
S
AB
A
步骤 符号栈
1) # 2) #a 3) #ab 4) #aA 5) #aAb 6) #aA 7) #aAc 8) # aAcd 9) #aAcB 10) #aAcBe 11) #S
A
·=
·=
(
<· <· ·= <·
11)
B
·>
·>
a
·>
·> ·=
)
·>
·>
# <· <·
·=
#b(B #bA #bAb #S
输入符号串
b(aa)b# (aa)b# aa)b# a)b# a)b# )b# b# b# b# # #
动作
#⋖b,移进 b⋖(,移进 (⋖a,移进 a.>a,归约A→a A.=a,移进 a.=),移进 ).>b,归约B→Aa) B.>b,归约A→(B A.=b,移进 b.>#,归约S→bAb 接受
4. 重复上述三步,直到归约完输入符号串,栈中只剩 文法的开始符号为止。
2021/3/10
讲解:XX
8
简单优先文法分析示例
❖ 文法G [S]:
➢ (1) S → bAb (2) A → (B|a (3) B → Aa)
❖ 1、确定文法符号之间的关系 ❖ 2、求出文法的简单优先关系矩阵 ❖ 3、对输入串进行分析(输入串b(aa)b# )
输入符号串
abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
动作
移进 移进 归约(A→b) 移进 归约(A→Ab) 移进 移进 归约(B→d) 移进 归约(S→aAcBe) 接受
对输入串abbcde#的移进-规约分析过程
a b b c d e 分析符号串abbcde是否G[S]的句子
相关文档
最新文档