编译原理 - 自下而上的语法分析
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*
S A
且
A
则称是句型相对于非终结符A的短语。 特别是,如果有A,则称是句型
相对于规则A的直接短语 一个句型的最左直接短语称为该句型
的句柄
5.1.7 规范归约例一
▪ 例:文法G[E]:
E→E+T|T
T→T*F|F F→(E)|–F|id
考虑文法G[E]上的句子id1+id2*id3 ➢ 其最右推导和分析树如图5.1(a)、(b)所示
第五章 语法分析—自下而上分析
内容
▪ 自下而上分析基本问题 ▪ 算符优先分析
5.1 自下而上分析基本问题
▪ 自下而上分析基本问题
➢ 归约 ➢ 规范归约 ➢ 符号栈的使用 ➢ 语法树的表示
▪ 算符优先分析
5.1.1 自下而上分析
▪ 自下而上分析
abbcde aAbcde (A b)
➢ 从输入字符的角度而言 aAcde (A Ab)
➢ 最左归约
规范推导
▪ 由规范推导推出的句型称为规范句型。
▪ 规范归约的中心问题:确定句型的句柄。
5.1.2 规范归约简述
▪ 最右推导,推导的每一步结果都是一个右句 型。该推导即分析树 “剪句柄”的全过程。
S
S
S
S
S
a A B ea A B ea A B ea A B e
Ab c d
Ab c d
d
图5.1 id1+id2*id3的最右推导、分析树与短语 (a) 最右推导;(b) 分析树;(c) 短语
5.1.7.1 归约的分析树
▪ 分析树的叶子与短语、直接短语和句柄有下述关系 ➢ 短语 以非终结符为根的子树中所有从左到右排列的 叶子 ➢ 直接短语 只有父子关系的树中所有从左到右排列的叶子 树高为2 ➢ 句柄 最左边父子关系树中所有从左到右排列的叶子 句柄是唯一的
产生式,而R
b…或R
Qb…;
3. a≯b 当且仅当G中含有形如P→…Rb…的
产生式,而R
…a或R
…aQ。
▪ 如果一个算符文法G中的任何终结符对(a,
b)至多只满足下述三关系之一:
a ≒ b,a ≮ b, a ≯ b
则称G是一个算符优先文法。
5.2.1 算符优先文法及优先表构造
▪ 例:考虑下面的文法G[E]:
5.2 算符优先分析
▪ 自下而上分析基本问题 ▪ 算符优先分析
➢ 算符优先文法及优先表构造 ➢ 算符优先分析算法 ➢ 优先函数 ➢ 算符优先分析中的出错处理
5.2 算符优先分析
▪ 考虑二义文法文法G(E): G(E): E i| E+E|E-E|E*E|E/E|(E)
➢ 它的句子有几种不同的规范归约。
(1) S aAcBe (2) A b
(3) A Ab (4) B d
句型 归约规则
S
abbcde (2) A b
aAbcde (3) A Ab a A c
aAcde aAcBe
(4) (1)
B S
d aAcBe
A
b
S
b
Be d
5.1.2 规范归约简述
▪ 定义:假定是文法G的一个句子,我们称 序列 n, n-1, ,0 是一个规范归约,如果此序列满足:
从输入开始
aAcBe (B d) S (S aAcBe)
逐步进行“归约”
直至归约到文法的开始符号
S
➢ 从语法树的角度而言
从语法树的末端开始 步步向上“归约” 直到根结
a A c Be
A
bd
b
5.1.2 自下而上分析法的基本思想
▪ 自下而上分析法
➢ 是一种“移进-归约”法 ➢ 基本思想
E1
E2 + T1
T2 T3 * F2
F1 F3
id3
id1 id2
短语:
id1+id2*id3(E1) id2*id3(T1) id1(E2, T2, F1) id2(T3, F3) id3(F2) 直接短语:id1(F1)、
id2(F3)、 id3(F2) 句柄:id1(F1)
(a)
(b)
(c)
(1) (2) (3) (4) (5) (6) (7) (8) (9)
E1
E2 + T1
T2 T3 * F2
F1 F3
id3
id1 id2
短语:
id1+id2*id3(E1) id2*id3(T1) id1(E2, T2, F1) id2(T3, F3) id3(F2) 直接短语:id1(F1)、
id2(F3)、 id3(F2) 句柄:id1(F1)
E1 => E2 + T1 => E2 + T3 * F2 => E2 + T3 * id3 => E2 + F3 * id3 => E2 + id2 * id3 => T2 + id2 * id3 => F1 + id2 * id3 => id1 + id2 * id3
(1) (2) (3) (4) (5) (6) (7) (8) (9)
(1) E→E+T | T
(2) T→T*F | F
(3) F→P F | P (4) P→(E) | i
➢ 由第(4)条规则,有 ‘(’ ≒ ‘)’;
➢ 由规则E→E+T和TT*F, 有 + ≮ *; ➢ 由(2)和(3),可得* ≮ ↑;
➢ 由(1)E→E+T和E E+T,可得+ ≯ +; ➢ 由(3)F→PF和F PF,可得↑ ≮ ↑。 ➢ 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
➢ ② 归约(reduce): 句柄在栈顶已形成,用适当 产生式左部代替句柄;
➢ ③ 接受(accept): 宣告分析成功; ➢ ④ 报错(error): 发现语法错误,调用错误恢复
例程。
▪ 考察文法G[S]:
SaABe Ab AAbc Bd 的输入序列abbcde,移进—归约方法分析 的符号栈变化过程如下所示。
➢ 1 n= ➢ 2 0为文法的开始符号,即0=S ➢ 3 对任何i,0 i n, i-1是从i经把
句柄替换成为相应产生式左部符号而得到的。
5.1.2 规范归约简述
▪ 把上例倒过来写,则得到:
➢ S aAcBe aAcde aAbcde abbcde
▪ 显然这是一个最右推导。
▪ 规范归约是关于是一个最右推导的逆过程
5.1.7.3 直接短语与句柄
▪ 只有父子关系的树中所有从左到右排列的叶子
➢ 从考虑推导E1 E2+id2*id3 T2+id2*id3 F1+id2*id3 id1+id2*id3
➢ id1是相对于非终结符E2、T2和F1的短语 ➢ 特别地,相对于F1的直接短语,也是句柄
E1 => E2 + T1 => E2 + T3 * F2 => E2 + T3 * id3 => E2 + F3 * id3 => E2 + id2 * id3 => T2 + id2 * id3 => F1 + id2 * id3 => id1 + id2 * id3
用一个寄存符号的先进后出栈 把输入符号一个一个地移进到栈里 当栈顶形成某个产生式的候选式时,把栈顶的这一
部分替换成(归约为)该产生式的左部符号
5.1.3 先进后出栈
▪ 例:设文法G[S]: (1) S aAcBe
(2) A b (3) A Ab (4) B d 试对abbcde进行“移进-归约”分析。
E1 E2 + T1
T2 T3 * F2
F1 F3
id3
id1 id2
短语:
id1+id2*id3(E1) id2*id3(T1) id1(E2, T2, F1) id2(T3, F3) id3(F2) 直接短语:id1(F1)、
id2(F3)、 id3(F2) 句柄:id1(F1)
(a)
(b)
(c)
▪ 归约即计算表达式的值。归约顺序不同,则计算 的顺序也不同,结果也不一样。
➢ 起决定作用的是相邻的两个算符之间的优先关系。如 果规定算符的优先次序,并按这种规定进行归约,则 归约过程是唯一的。
▪ 所谓算符优先分析法就是定义算符之间的某种优 先关系,借助于这种关系寻找“可归约串”和进 行归约。
5.2 算符优先分析
➢ E E+T E+F E+i3 T+i3 T*F+i3 T*i2+i3 F*i2+i3 i1*i2+i3
➢ 短语: i1,i2,i3, i1*i2, i1*i2+i3
T
F
T * F i3
➢ 直接短语: i1,i2,i3 ➢ 句柄: i1
F
i2
i1
5.1.2 规范归约简述
▪ 可用句柄来对句子进行归约 ▪ 例:设文法G[S]:
▪ 具体实现采用移进—归约方法,用一个栈 “记住”将要归约句柄的前缀,并用一个 分析表来确定何时栈顶已形成句柄,以及 形成句柄后选择哪个产生式进行归约。
5.1.3 符号栈的使用与语法树的表示
▪ 在移进—归约分析模式中,符号栈的使用 有以下四种操作形式。
➢ ① 移进(shift): 把当前输入中的下一个终结符 移进栈;
5.1.7.2 短语
▪ 以非终结符为根的子树中所有从左到右排列的叶子
➢ 从文法开始符号经过0步推导得到E1,从E1经过若干步推导得到 id1+id2*id3,所以id1+id2*id3是句型id1+id2*id3相对于E1的短语
➢ id1+id2不是句型id1+id2*id3中相对于任何非终结符的短语,因为找 不到任何一个非终结符,它的子树中的所有叶子构成id1+id2
e
d
B
B
b
c
c
c
c
b
A
A
A
A
A
A
A
a
a
a
a
a
a
a
a
a
S
5.1.5 归约的语法树分析法
S
aA c
A
b
b
Be d
▪ 分析树和语法树
➢ 不一定一致
▪ 自下而上分析过程
➢ 边输入单词符号, 边归约
▪ 核心问题
➢ 识别可归约串
5.1.6 规范归约简述
▪ 定义:令G是一个文法,S是文法的开始符
号,假定是文法G的一个句型,如果有
e
Bd
abbbbcccdddeee
bc
Ab
Sa
5.1.4 移进-归约分析
▪ 例:设文法G[S]: (1) S aAcBe
(2) A b (3) A Ab (4) B d 试对abbcde进行“移进-归约”分析。
步骤: 1
2
3
4
567ຫໍສະໝຸດ 89 10动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)
▪ 定义任何两个可能相继出现的终结符a与b 的优先关系: 三种关系
a ≮ b a的优先级低 于b a ≒ b a的优先级等于b a ≯ b a的优先级高于b
▪ 注意:与数学上的<、>、=不同,a ≮ b并 不意味着b ≯ a
5.2.1 算符优先文法及优先表构造
▪ 一个文法,如果它的任一产生式的右部都不含两 个相继(并列)的非终结符,即不含如下形式的产 生式右部: …QR… 则我们称该文法为算符文法。
E1 => E2 + T1 => E2 + T3 * F2 => E2 + T3 * id3 => E2 + F3 * id3 => E2 + id2 * id3 => T2 + id2 * id3 => F1 + id2 * id3 => id1 + id2 * id3
(1) (2) (3) (4) (5) (6) (7) (8) (9)
▪ 约定:
➢ a、b代表任意终结符; ➢ P、Q、R代表任意非终结符; ➢ ‘…’代表由终结符和非终结符组成的任意序列,包括
空字。
▪ 假定G是一个不含-产生式的算符文法。 对于任何一对终结符a、b,我们说:
1. a≒b 当且仅当文法G中含有形如 P→…ab…或P→…aQb…的产生式;
2. a≮b 当且仅当G中含有形如P→…aR…的
步骤
栈内容
当前输入
动作
(0)
#
(1)
#a
(2)
#ab
(3)
#aA
(4)
#aAb
(5)
#aAbc
(6)
#aA
(7)
#aAd
(8)
#aAB
(9)
#aABe
(10)
#S
abbcde# bbcde# bcde# bcde# cde# de# de# e# e# # #
shift shift reduced by A→b shift shift reduced by A→Abc shift reduced by B→d shift reduced by S→aABe accept
(a)
(b)
(c)
5.1.8 规范归约例二
▪ 例:考虑文法G[E]
ET|E+T TF|T*F F(E)|I
和句型i1*i2+i3
➢ 在一个句型对应的语法树中,以某非终结符为根的
E
两代以上的子树的所有末端结点从左到右排列就是
E + 相对于该非终结符的一个短语,如果子树只有两代,
T
则该短语就是直接短语。
b
(a)
(b)
(c)
(d)
(e)
图3.18 剪句柄的过程
(a) 句子;(b) 剪去b之后;(c) 剪去Abc之后;(d) 剪去d之后;(e) 开始符号
5.1.3 符号栈的使用与语法树的表示
▪ 从分析树上直观地看,“剪句柄”的方法 十分简单。但是若在语法分析器中实现剪 句柄,则有两个问题必须解决:
➢ ① 确定右句型中将要归约的子串(确定句柄); ➢ ② 确定如何选择正确的产生式进行归约。