编译原理课件 第5章 语法分析自下而上分析
编译原理 - 自下而上的语法分析
![编译原理 - 自下而上的语法分析](https://img.taocdn.com/s3/m/a45366e1360cba1aa811da53.png)
*
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 ➢ 句柄 最左边父子关系树中所有从左到右排列的叶子 句柄是唯一的
编译原理课件 语法分析_自下而上__LR分析思想_可归前缀和活前缀
![编译原理课件 语法分析_自下而上__LR分析思想_可归前缀和活前缀](https://img.taocdn.com/s3/m/e2693e0c59eef8c75fbfb31f.png)
识别文法所有活前缀的
DFA
小结
识别文法所有活前缀的DFA LR分析表 LR分析
7.2.1 可归前缀和活前缀
归约 移进 归约 移进 移进 归约 移进 归约 接受
A→b
A→Ab
B→d S→aAcBe
A
B
#abbcde# 的规范归约过程
a b b c d e
定义
• 活前缀: 规范句型的一个前缀, 这种前缀不包含 句柄之后的任何符号. • 可归前缀: 包含句柄的活前缀.
LR 分析思想
规范归约过程中可能出现在栈中的符号串 活前缀
• LR 分析思想: 构造一个DFA, 识别 规范归约过程中出现在栈中的符号串
活前缀
G:S→aAcBe A→b A→Ab B→d [1] [2] [3] [4]
S 0 a
1
*
b
3
A 4 b 5 c e B 6 8 9 d 2 7
步 符号栈 骤 活前缀 1 # 2 #a
3
4 5
剩余 动作 输入串 abbcde# 移进 bbcde# 移进
G: S→ aAcBe A→ b | Ab B→ d 1.栈里的文法符号与剩 余符号串一起构成了 规范句型 2.栈里的文法符号串 • 规范句型的前缀 • 不包含句柄之后的任 何符号 S A源自67 89
10 11
#ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
bcde# bcde# cde# cde# de# e# e# # #
软件工程 编译原理 第五章 自顶向下的语法分析方法
![软件工程 编译原理 第五章 自顶向下的语法分析方法](https://img.taocdn.com/s3/m/d03a3657804d2b160b4ec01e.png)
例:文法G(E):
E→TE E→+TE | T→FT PROCEDURE F; T→*FT | IF SYM=‘i’ THEN ADVANCE F→(E) | i ELSE 对应的递归下降子程序为: IF SYM=‘(’ THEN
其中不以P开头。
可以把P的规则等价地改写为如下的非直接左递归 形式: 左递归变 P→P 右递归 P→P|
一般而言,假定P关于的全部产生式是 P→P1 | P2 | … | Pm | 1 | 2|…|n 其中,每个都不等于,每个都不以P开头 那么,消除P的直接左递归性就是把这些规则改写 成:
第5章 自顶向下的语法分析方法
语法分析的作用是识别由词法分析给出 的单词符号序列是否是给定文法的正确句 子(程序)。 目前语法分析常用的方法有: 1、自顶向下(自上而下)分析 2、自底向上(自下而上)分析
5.3非LL(1)文法到LL(1)文法的等价转换
确定的自顶向下分析要求给定语言的文法必
须是 LL(1)形式。然而,不一定每个语言都是 LL(1)文法,对一个语言的非LL(1)文法是否能变
换为等价的LL(1)形式以及如何变换是我们讨论
的主要问题。由LL(1)文法的定义可知若文法中 含有左递归或含有左公共因子,则该文法肯定不 是LL(1)文法,因而,我们设法消除文法中的左 递归,提取左公共因子对文法进行等价变换。
1、提取公共左因子
若文法中含有形如:A→αβ|αγ的产生式,这导 致了对相同左部的产生式其右部的FIRST集相交, 也就是 SELECT(A→αβ)∩SELECT(A→αγ) ≠ φ ,不满足 LL(1)文法的充分必要条件。
编译原理-自上而下的语法分析
![编译原理-自上而下的语法分析](https://img.taocdn.com/s3/m/bb24a429793e0912a21614791711cc7931b7780b.png)
高效性
由于从文法的最顶端开始分析, 一旦发现不匹配,就可以立即终 止当前分支的搜索,避免不必要 的计算,提高了编译器的效率。
易于处理左递归文
法
自上而下的分析方法可以很方便 地处理含有左递归的文法,而左 递归是许多实际编程语言的重要 特征。
局限性
无法处理左边界问题
自上而下的分析方法在处理某些含有左边界的文法时可能 会遇到问题,因为这种方法会优先匹配最左边的符号,而 左边界问题需要从右往左匹配符号。
案例三
在编译器优化中,自上而下的语法分析被用 于识别和修改源代码中的冗余和低效的语法 成分。例如,在C编译器的实现中,自上而 下的语法分析可以用于优化循环结构,减少 不必要的循环次数,提高程序的执行效率。
自上而下的语法分析还可以用于代码生成和 代码生成器的实现。通过识别和解析源代码 中的语法成分,可以生成更高效、更安全的 机器代码或字节码,提高程序的执行效率和
安全性。
THANKS
感谢观看
详细描述:递归下降分析算法易于理解,每个产生式规 则对应一个函数,函数的实现相对简单明了。
详细描述:对于每个产生式规则,需要编写相应的递归 函数,可能会导致代码冗余。
移入-规约分析算法
总结词
基于栈的算法
详细描述
移入-规约分析算法是一种自上而下的语法分 析算法,它将目标语句从左到右依次读入, 并根据文法的产生式规则进行移入或规约操 作,直到找到目标语句的语法结构。
词法分析
词法分析是编译过程的第一步,也称为扫描或词法扫描。它的任务是从左 到右读取源代码,将其分解成一个个的记号或符号。
词法分析器通常使用正则表达式或有限自动机来识别和生成记号,这些记 号可以是关键字、标识符、运算符、标点符号等。
编译原理:第五章-语法分析——自下而上分析
![编译原理:第五章-语法分析——自下而上分析](https://img.taocdn.com/s3/m/a8cc05c2710abb68a98271fe910ef12d2bf9a95c.png)
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(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) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
编译原理第三版 第五章 自下而上语法分析
![编译原理第三版 第五章 自下而上语法分析](https://img.taocdn.com/s3/m/8c2cdf1f866fb84ae45c8d67.png)
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理 第五章 语法分析-自下而上分析
![编译原理 第五章 语法分析-自下而上分析](https://img.taocdn.com/s3/m/8745e92158fb770bf78a5515.png)
5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
编译原理_第5章(清华大学)
![编译原理_第5章(清华大学)](https://img.taocdn.com/s3/m/820966cf58f5f61fb73666e9.png)
学习目标: ➢掌握:LL(1)文法的判别,预测分析
法,递归子程序的构造方法 ➢理解:LL(1)文法 ➢了解:不确定的自顶向下分析
语法分析的作用是识别由词法分析给出的单词序 列是否是给定文法的正确句子
分类:
语法分析
自顶向下分析 自底向上分析
确定的
不确定的 算法优先分析(第六章)
进行推导,类似地LL(k)文法需要向前看K个符号才 可以确定选用哪个产生式。
例 有文法G[S]为:
S→aAS
SELECT(S→aAS)= {a}
S→b
SELECT(S→b)= {b}
A→bA
SELECT(A→bA)= {b}
A→ε
SELECT(A→ε)=Follow(A)= {a,b}
Hale Waihona Puke 由于SELECT(A→bA)∩SELECT(A→ε)={b}≠Φ,
此外若可能导出空串,A自动获得匹配,输入符a 有可能与A后的一个符号匹配,所以当a应属于 Follow(A)时,选择产生式A→也是可以的。
直观上说某产生式A→α的选择集合是指遇到哪些输 入符号(包括#)时选用该产生式向下推导。
例 G3[S]: 若α≠>*ε,则SELECT(A→α)=FIRST(α) S→aA 若α=>*ε, 则SELECT(A→α)
例文法G2[S]: S→Ap FIRST(Ap)={a,c}
S→Bq FIRST(Bq)={b,d}
A→a
FIRST(a)={a }
A→cA FIRST(cA)={c}
B→b
FIRST(b)={b}
B→dB FIRST(dB)={d}
由于同一非终结符的两个产生式的右部推导出来的 开始符号集不相交,因此可根据当前输入符属于哪 个产生式右部的开始符号集而决定选哪个产生式进 行推导,可以进行确定的自顶向下分析
编译原理ch5 自下而上语法分析-part2
![编译原理ch5 自下而上语法分析-part2](https://img.taocdn.com/s3/m/c1ba1714650e52ea54189800.png)
—自下而上分析 Part II
5.3 5.4
LR分析概述 LR(0)分析
5.5
5.6
SLR(1)分析
LR(1)分析
2013-7-6
2
LR(k)分析法是一类对上下文无关文法进行“自左至右扫描 和规范(最左)归约(最右推导的逆过程)”分析的方法, 分析的每一步只需根据分析栈当前已移进或归约出的全部文 法符号,并至多向前看k个输入符号,即能确定句柄是否已 经在栈顶形成,从而决定需进行归约还是移进 对一般的程序设计语言的语法,只需考虑k≤1,即LR(0)或 LR(1) LR分析器可用来识别大部分上下文无关文法描述的语言
2013-7-6 28
∴构造DFA方法: 1) 确定S集合,即LR(0)项目集规 范族,同时确定S0 2) 确定状态转移函数GOTO
2013-7-6
29
LR(0)分析
确定状态集合 每一个状态对应文法中某一个产生式规则的某一个 项目 每一个产生式规则的每一个项目代表一个活前缀的 识别状态 产生式规则的项目?
2013-7-6
6
(2) 状态转换表GOTO
符号 状态 S0 X1
GOTO[S0 , X1]
X2
GOTO[S0 , X2]
…
…
Xt
GOTO[S0 , Xt]
S1
… Sn
GOTO[S1 , X1]
…
GOTO[S1 , X2]
…
…
… …
GOTO[S1 , Xt]
…
GOTO[Sn , X1]
GOTO[Sn , X2]
S2
S3
2013-7-6
46
编译原理 第5章
![编译原理 第5章](https://img.taocdn.com/s3/m/4504e47bcaaedd3383c4d399.png)
例:有文法G(S):
S→bAb A→( B | a B→Aa ) 解:文法符号优先关系推导如下: (1) 求=· 关系: 由S→bAb , A→( B, B→Aa ) b =· A, A =· b, (=· B , A =· a, a =· )
自底向上的语法分析
• 核心问题
– 寻找可归约串。对“可归约串”概念的不同定义, 就形成了不同的自底向上的分析方法。在算符优 先分析法中我们用“最左素短语”来刻画“可归 约串”,在“规范归约”中,则用“句柄”来刻 画“可归约串”
分析方法
• 输入串:
abbcde
S → a A c B e A → A b|b B → d
S
b
>·
=· <·
>·
A
(
=·
<· <· =·
=·
<·
B
a
>·
>·
>·
>· =· =·
)
#
寻找句柄
>·
<· <·
>·
简单优先文法的定义: (1)在文法符号集中,任意两个符号之间最多只有 一种优先关系; (2)在文法中任意两个产生式没有相同的右部。
语法树结构如下:
S S S b S b
b
A b
B
b
U S0…Sj-1SjSj+1Sj+2… …Si-1SiSi+1…Sn
算符优先分析
• 我们要通过两个相邻符号SiSi+1之间的关系来找到句 柄: – SiSi+1在句柄内:必然有规则U …SiSi+1… – Si在句柄内部,但是Si+1在句柄之后:必然有规则 U …Si,且存在规范句型…USi+1…。 – 如果Si+1在句柄内,而Si在句柄外,那么必然存在 规范句型…SiU…,且U Si+1…。
编译原理-自上而下语法分析
![编译原理-自上而下语法分析](https://img.taocdn.com/s3/m/49af577433687e21ae45a911.png)
递归下降分析程序构造 预测分析程序 LL(1)分析中的错误处理
4.3.1 不带回溯的自上而下分析算法
自上而下分析方法
不允许文法含有任何左递归 构造不带回溯的自上而下分析算法
消除文法的左递归性
找出克服回溯的充分必要条件
4.3.2 左递归的消除(一)
直接消除产生式中的左递归
4.1.1 语法分析器的功能
高级语言的语法结构
适合用上下文无关文法描述
语法分析器
任务:分析与判定程序的语法结构是否符合语法规则
工作本质:根据产生式识别输入串是否为一个句子
在编译器中的地位:核心部分
源程序
单词符号
词法分析器
取下一个单 词符号
语法分析器
语法分析树
编译器的 后继部分
那么,可以把这些规则改写成
A→A | 1 | 2 | … | m A→ 1 | 2 | … | n
经过反复提取左因子,就能够把每个非终结符(包括
新引进者)的所有候选首符集变成为两两不相交
4.3.3 消除回溯、提左因子(三)
例4.4:考察文法G:
S → iCtS | iCtSeS | a C→b
自上而下
从文法的开始符号出发,向下推导,推出句子
存在问题:带“回溯”
克服方法
不带回溯的递归子程序(递归下降)分析方法
自上而下分析的主旨
为输入串寻找一个最左推导 对任何输入串,试图用一切可能的办法,从文法开始
符号(根结点)出发,自上而下地为输入串建立一棵 语法树
4.2.2 回溯举例
4.3.3 回溯的消除(一)
为了消除回溯就必须保证
编译原理课件 语法分析自下而上分析
![编译原理课件 语法分析自下而上分析](https://img.taocdn.com/s3/m/45db38c5b14e852458fb571f.png)
22
移进归约:系统框架
n 输入缓冲区:保存输入符号串,设符号串以# 为结束符,有一个指针,指向当前输入符号。
n 分析栈(符号栈):保存文法符号,记载分析的 历史 — 已经得到的部分结果;指示分析的 下一步动作 ---展望未来。
n 控制程序:控制分析的过程,输出分析结果。 分析中,栈顶未形成可归约串时则移进当前 输入符号到栈;当栈顶形成可归约串(是某个 非终结符的某个候选式)时则归约: 栈顶的可 归约串出栈, 该非终结符进栈。
A
B
⇒aAbcdeα3 ⇒abbcde α4
a b b cd e
20
• 练习:文法G(S): S → (L) | aS | a L → L , S | S (1)指出句子 (a,(a)) 的规范归约; (2)指出每次归约用的句柄。
解:(1)规范归约: (a,(a)) ,(S,(a)) ,(L,(a)) ,(L,(S)) ,(L,(L)) ,(L,S) ,(L) ,S
9
例5.2:文法G[S], 其4条产生式如下:
① S→aABe
② A→b
③ A→Abc
④ B→d
对句子abbcde的分析
最右推导 S⇒aABe⇒aAde⇒aAbcde⇒abbcde
最左归约 abbcd,eaAbcde ,aAde,aABe,S
S
S
A
A
B
⇒aABe ⇒aAde ⇒aAbcde
a b b cd e
T * i2 + i3
i2 + i3 #
读入* , *进栈
L, S
(2) n 短语: S、a、(a)、S,(a)、(S,(a))
编译原理 第05章_算符优先分析法
![编译原理 第05章_算符优先分析法](https://img.taocdn.com/s3/m/bdb130c23186bceb19e8bb8c.png)
S)中不存在形如A…BC…的产生式,则称之为算符文
即:如果文法G中不存在具有相邻非终结符的产生式,
符文法,如果该文法中的任何终结符号对a,b之间,在三种
关系中最多只有一种成立,则称该文法为算符优先文法。
(1)求文法中每个非终结符P的首终结符集合FIRSTVT(P)
①定义:FIRSTVT(P)={a|P+a…或者P+Qa…,a ∈VT,P,Q
FOR
THEN
FIRSTVT(Xi+1)中的每个a DO THEN
置 Xi≮a;
IF Xi为非终结符而Xi+1为终结符
FOR
置 END;
LASTVT(Xi)中的每个a DO
a≯Xi+1;
4、直观算法优先算法:
(1)直观算符优先法的下推自动机:
两个工作栈:①算符栈OPTR:用于存放运算符
②算量栈OPND:用于存放运算量
E
E T F i + T T * F F i i
第5章 算符优先分析法
②算符优先分析法每一次归约时,可归约串中至少有一个终结符。
i+i*i# E+i*i# E+T*i# E+T*F# E+T# E#
E E i + T T * F i i
第5章 算符优先分析法
(3)最左素短语:
素短语是指至少含有一个终结符,并且除它自身 之外不再含有更小的素短语。 最左素短语指处于句型最左边的那个素短语。 最左素短语具备三个条件:
i+i-i*(i+i)
①矩阵元素M(a,b)表示a在前,b在后时,a与b之间的优先关系。
②矩阵元素M(a,b)的取值:≮,≯,≡ 。
编译原理第五章语法分析——自下而上分析
![编译原理第五章语法分析——自下而上分析](https://img.taocdn.com/s3/m/6e7c3abef01dc281e43af090.png)
第五章语法分析——自下而上分析要紧内容:[1]自下而上分析的大体问题[2]算符优先分析法[3]算符优先分析表和优先函数的构造[4]LR分析器的大体原理大体要求:[1]明白得自下而上分析法的大体思想[2]明白得有关归约、短语、句柄、标准归约等概念[3]把握算符优先分析法[4]了解算符优先表和优先函数的构造技术[5]了解LR 分析器大体原理和工作方式教学要点:本章介绍自下而上语法分析方式。
所谓自下而上分析法确实是从输入串开始,慢慢进行“归约”,直至归约到文法的开始符号;或说,从语法树的结尾开始,步步向上“归约”,直到根结。
讲义摘要:5.1 自下而上分析大体问题自下而上分析法的大体思想:从输入串开始,慢慢进行“归约”,直到文法的开始符号。
即从树结尾开始,构造语法树。
所谓归约,是指依照文法的产生式规那么,把产生式的右部替换成左部符号。
自上而下分析的核心问题是:如何判定符号串的可归约性,和如何归约。
即,识别可归约串的问题。
归约自下而上分析法事实上确实是一种“移进-归约”法,即,采纳“移进-归约”思想进行。
实现思想是:对输入符号串自左向右进行扫描,并将输入符逐个移入一个后进先出栈中,边移入边分析,一旦栈顶符号串形成某个句型的句柄时,(该句型对应某产生式的右部,即栈顶生成了某产生式的右部的文法符号串),就将栈顶的这一部份替换成 (归约为) 该产生式的左部符号,这称为归约。
重复这一进程直到归约到栈中只剩文法的开始符号时那么为分析成功,也就确认输入串是文法的句子。
现举例说明。
例1:设文法G[S]为:(1) S→aAcBe(2) A→b(3) A→Ab(4) B→d试对abbcde进行“移进-归约”分析。
步骤: 1 2 3 4 5 6 7 8 9 10解:动作: 进a 进b 归(2) 进b 归(3) 进c 进d 归(4) 进e 归(1)表1符合栈的转变进程自下而上语法分析的进程也可看成自底向上构造语法树的进程,每步归约都是构造一棵子树,最后当输入串终止时恰好构造出整个语法树,如图1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
L , S
S ( a L )
S a
21
5.1.3 符号栈的使用与语法树的表示
符号栈的使用
自下而上分析法要使用一个符号栈(语法分析的一 种基本数据结构),分析中根据符号栈顶是否形成句 柄决定是移进还是归约。 符号栈 输入串 分析开始: # ω# 分析中: #α β# 分析结束时: # S # 分析中任何时候:
则称是句型 相对于非终结符A的短语。 直接短语 如果有 S*A 且 A 则称是
句型 相对于规则 A 的直接短语。
句柄:一个句型的最左直接短语。 注意:短语的两个条件缺一不可, αAδ是句 型,β符号串可由A出发推导出来。
13
• 例5.4 求P85.(5.2)文法的另一个句型 E+T*F+i 的短 语。 • 解:EE+TE+T+TE+T*F+TE+T*F+FE+T*F+i
动作
预备 读入 i1 , i1进栈 归约,Fi 归约,T F 读入* , *进栈 读入 i2 , i2进栈 归约,F i 归约,T T*F 归约,E T 读入+ , +进栈 读入 i3 , i3进栈 归约, F i 归约, T F 归约,E E+T 接受
句型和句柄
i1 * i2 + i3 F * i2 + i3 T * i2 + i3
如何归约 算符优先分析算法设计 (5.2.2)
31
例5.8
表达式文法G[E] : E→E+E|E-E|E*E|E/E|EE|(E)|i
– 对这个二义文法可能会有好几个规范推导和归 约,真正运算时也有几种不同结果。 –如果规定算符(终结符)的优先级从高到低为: 乘幂运算符,乘、除运算符,加、减运算符;同 级运算符服从左结合原则;有括号时,先括号内 后括号外,那么,句子的归约过程就是唯一的。
归约--剪子树
S A
句型abbcde的句柄是b ,把句 柄剪去(归约)就形成了句型 S aAbcde的语法树。
A
a b b c
B
d e
α0 aABe α1 aAde α2 aAbcdeα3 abbcde α4
20
• 练习:文法G(S): S (L) | aS | a (1)指出句子 (a,(a)) 的规范归约; (2)指出每次归约用的句柄。
T * F + i3 T + i3 E + i3
E+F E+T E 开始符号
回顾:
自下而上语法分析方法 --- ‚移进-归约‛法
符号栈顶 没有形成 可归约串, 决定是 形成 移进 归约
定义可归约串要解决:
1. 定义什么样的符号串是可归约串; 2. 在分析时怎样判定符号栈顶出现了可归约串; 3. 如何归约。
4
5.1 自下而上分析的基本问题
定义:栈顶形成的某产生式的候选称为归约串。 自底向上分析方法,也称移进-归约分析法,粗 略地说它的实现思想是对输入符号串自左向右进 行扫描,并将输入符逐个移入一个后进先出栈中, 边移入边分析,一旦栈顶符号串形成某个归约串 时,(某产生式的右部),就用该产生式的左部 非终结符代替相应右部的文法符号串,这称为归 约。重复这一过程直到归约到栈顶中只剩文法的 开始符号时则为分析成功,也就确认输入串是文 法的句子。
或者说从文法的开始符号产生句子。
自下而上分析采用的方法是归约,从叶子到根构造分析树。
或者说从句子开始归约出文法的开始符号。
语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
7
5.1.1
归约
自下而上分析的核心问题:就是寻找句型中的“可 归约串”进行归约。
对“可归约串”概念的不同定义,就形成了 不同的自下而上的分析方法。 在“规范归约”中,则用“句柄”来刻 画“可归约串” 在“算符优先分析法”用“最左素短语” 来刻画”可归约串”
8
5.1.1
归约
语法分析树: 一棵倒立的树,可用于描述语法分析的过程; 自上而下分析采用的方法是推导,从根到叶子构造分析树。
cde
归约
6
经分析,判定该句子是G合法的句子.
5.1.1
归约
归约串分为:可归约串、非可归约串
在上例中,当栈中为aAb时,存在两个归约串:b及Ab,都可 以归约为A;
若使用b进行归约,栈中得到aAA,导致最终不能归 约为S,因此,判定输入字符串非法; 这是一种错误归约, 原因在于栈中同时存在多个归 约串,而只有一个归约串的选择是正确的,如Ab; 把Ab称为可归约串,而b为非可归约串
5.4 语法分析器的自动产生工具 YACC---了解
2
5.1 自下而上分析的基本问题
自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。
各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
– E+E+T*F+i – E+E+T*F – TT*F + – T i – Fi
–短语有4个:E+T*F+i (相对于E); E+T*F(相对 于E); T*F(相对于T);i (相对于T、F) 。 –T*F 和 i 为直接短语 –T*F为句柄。
14
5.1.2
规范归约简述
语法树的一个子树的所有叶结点的自左至右 排列形成一个相对于子树根的短语。P86 有多少棵子树就有多少个相对于子树根结 (非终结符)的短语, 短语由某子树的全部叶 结点组成。 若短语是由某子树根经过1步推导得到的, 则称之为该子树根的直接短语。
3
5.1 自下而上分析的基本问题
自下而上分析的基本技术是采用归约栈,如下图所示: #
a1a2......an
归约栈 字符串 把输入符号依次移入栈内,当栈顶符号串形成某产生式 的右部时,就归约为产生式左部非终结符; 继续移入输入字串,直到栈中归约为文法初始符号S. 这种方法也称为‚移进-归约法‛.
• 自上而下 从文法的开始符号出发,反复使用文法的产生式, 寻找与输入符号串匹配的推导(最左推导),若能 推导出与输入字串相同的句子,则表示输入字符串是 合法的; • 特点 从文法开始符开始; 推导中始终使用产生式的右部替换左边的非终结符; • 自下而上 根据文法,对输入符号串进行归约,若能正确地归约 为文法的初始符号,则表示输入字串是合法的。 • 归约:在输入串中,寻找一条产生式的右部,如果 找到用产生式的左边的非终结符替换右部。 • 特点 从输入串开始; 归约中始终使用产生式的左部替换右边的候选式;
则成功,达不到这种格局则输入串有错误。
栈中符号串+剩余输入串 = 规范句型。
24
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行 归约; 3. 重复(2) 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为 合法的句子,否则为非法句子.
L , S (
S
a
17
5.1.2
规范归约简述
规范归约是一种较常用的自下而上分析方法。 规范归约:是关于句子α的一个最右推导的逆 过程。 ■也称最左归约。 ������ 规范归约采用句柄来刻画可归约串。������ 每次归约总是句型的句柄归约。
18
5.1.2
规范归约简述
为加深对句柄和归约等概念的理解,用修剪 语法树方法进一步阐明规范归约这一自下而 上分析过程。 一个句型的句柄是该句型对应的语法树中最 左直接短语 。
可采用修剪语法树方法实现归约,即寻找当 前语法树的句柄,将句柄中的树叶剪去(归约), 不断修剪直到只剩根结点,完成整个规范归 约过程.
19
例5.6
① S→aABe ③ A→Abc 句子abbcde的规范归约。
文法G[S],
② A→b ④ B→d 求对
规范归约为: abbcde,aAbcde,aAde,aABe,S
A
A a b b c B d e
5.1.1
归约
归约与推导关系:
推导与归约互逆关系 最右推导称为 规范推导
最右推导得到的句型称为规范句型
最左归约称为 规范归约
12
5.1.2
规范归约简述
令G是一个文法,S是文法的开始符号 短语 假定是文法G的一个句型,如果有:
S*A 且 A +
#S
#
26
5.1.3 符号栈的使用与语法树的表示
语法分析对符号栈的使用有四类操作:P88 1) 移进:将当前输入符号移入栈。
2)归约:用产生式左侧的非终结符替换栈顶的可归 约串。 3) 接受:分析成功,分析结束,接受输入串。
4) 出错:出错处理。
注意: 可归约的串在栈顶,不会在内部
27
例5.7 i1*i2+i3 的规范归约步骤(P88.)