第五章 自上而下语法分析

合集下载

第5章 语法分析(2)自下而上分析

第5章 语法分析(2)自下而上分析

则成功,达不到这种格局则输入串有错误。

栈中符号串+剩余输入串 = 规范句型。
26
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行归约; 3. 重复2 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为合法的 句子,否则为非法句子.
2
5.1 自下而上分析的基本问题

自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。

各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
3
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
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )

《编译原理》第5章自上而下语法分析

《编译原理》第5章自上而下语法分析

编译原理武汉大学计算机学院编译原理课程组第5章自上而下语法分析·基本思想·存在的问题·解决方法·LL(1)方法·递归子程序法5.0 语法分析的功能及基本思想依据语法规则,逐一分析词法分析时得到的单词,把单词串分解成各类语法单位,即确定它们是怎样组成说明和语句,以及说明和语句又是怎样组成程序的。

分析时如发现有不合语法规则的地方,便将出错的位置及出错性质打印报告给程序员;如无语法错误,则用另一种中间形式给出正确的语法结构,供下一阶段分析使用。

1. 语法分析的功能5.0 语法分析的功能及基本思想2.自上而下语法分析的基本思想从识别符号出发,不断建立直接推导,试图构造一个最左推导序列,最终由它推导出与输入符号串相同的符号串。

从语法树的角度看,自顶向下分析过程将以识别符号为根结点,试图向下构造一棵语法树,其末端结点符号串正好与输入符号串相同。

相应于高级语言的编译过程,自上而下语法分析就是从该高级语言文法的开始符号——<程序>出发,试图推导得到该文法的句子——源程序或与其等价的单词串。

3. 自上而下语法分析遇到的问题5.0 语法分析的功能及基本思想在分析的过程中,匹配失败后,必须退回到出错点,选择其它可能的产生式重新推导,这个过程称为回溯。

如果文法中存在如下形式的产生式A →α1|α2|…|αn那么在自上而下的语法分析过程中,当要对A 展开时,应按哪一个后选式展开呢?即如何确定替换A 的αi 。

如果选择错误,将导致回溯。

5.0 语法分析的功能及基本思想3. 自上而下语法分析遇到的问题当文法中出现左递归时(存在非终结符号U,对于它有+⇒U→U…或U U…),会使分析过程陷入无限循环。

例如对文法G[S]:S→ABA→bB|AaB→Sb|a5.0 语法分析的功能及基本思想4.自上而下语法分析中问题的解决方法·避免回溯·消除左递归5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示[x]——x可以出现零次或一次{x}——x可以出现零次到多次x(y|z)——等价于xy或xz5.1 消除左递归的方法1.直接左递归的消除•采用扩充BNF表示•引进新的非终结符号,将左递归改写为右递归。

软件工程 编译原理 第五章 自顶向下的语法分析方法

软件工程 编译原理 第五章 自顶向下的语法分析方法

P→1P | 2P |… | mP |
(2)消除间接左递归
对于间接左递归的消除需先将间接左递归变为直接左 递归,然后再按a)消除直接左递归。
例:文法G为例: (1) A→aB (2) A→Bb (3) B→Ac (4) B→d 用产生式(1)、(2)的右部 代替产生式(3)中的非终 结符A得到左部为B的产 生式为: (1) B→aBc (2) BG的产生式为: (1) S→aSb (2) S→aS (3) S→ε 请提取文法中的左公因子
对产生式(1)、(2)提取左公因子后得: S→ aS(b|ε) S→ε 进一步变换为文法G′: S→aSA A→b A→ε S→ε
例2:若文法G的产生式为: (1) A→ad (2) A→Bc (3) B→aA (4) B→bB 请提取文法中的隐式左公因子。 对文法G2分别用(3)、(4)的右 部替换(2)中的B,可得: 提取产生式(1)、(2)的左 (1) A→ad 公共因子得: (2) A→aAc A→a(d|Ac) (3) A→bBc A→bBc (4) B→aA B→aA (5) B→bB B→bB
由上面所举例子可以说明以下问题:
① 不一定每个文法的左公共因子都能在有限的步骤内 替换成无左公共因子的文法,上面文法G4就是如此。 ② 一个文法提取了左公共因子后,只解决了相同左部 产生式右部的FIRST集不相交问题,当改写后的文法 不含空产生式,且无左递归时,则改写后的文法是 LL(1)文法,否则还需用LL(1)文法的判别方式进行判 断才能确定是否为LL(1)文法。
例:文法G(E):
E→TE E→+TE | T→FT T→*FT | F→(E) | i
每个非终结符有对应的子程序的定义, 首先在分析过程中,当需要从某个非终 结符出发进行展开(推导)时,就调用这 个非终结符对应的子程序。

第5章自上而下的语法分析

第5章自上而下的语法分析

47

利用SELECT构造分析表

①若SELECT(U→α )={a1,a2,…,an},其中ai为终结符或$或, 则置M[U,ai]为产生式U→α ,(i=1,2,…,n). ②凡未被定义的M[U,a]项中标以出错标志.


利用FIRST,FOLLOW构造分析表和利用SELECT构造分析表两者是等 价的.
a1 zk zk-1 ak
有限状态控制
$
输出带
z0
7
PDA的形式定义

下推自动机PDA=(Q,Σ , H,δ ,q0, Z0,F)



Q为有限状态集 是一个有穷的字母表 H为有限下推栈字母表 ,约定对于H*, 的 最左字符在栈顶, =时下推栈为空 q0Q,为PDA的初态


z0H,为下推栈的初始符号z015Fra bibliotek例5.1
16
带回溯自上而下方法的缺陷
如何生成回溯自上而下步骤:
1.消除左递归
2.消除回溯
17
左递归
递归定义:
直接递归:
18
左递归
间接左递归
19
直接改写法消除直接左递归
20
直接改写法消除直接左递归

21
消除所有左递归的算法
22
消除所有左递归的算法
23
消除所有左递归的算法
24
25
* (如果 ) First ( ) Select( A ) * ( A) (如果 ) First ( ) Follow
48
例5.11
G[ E]: (1) (4) (7) E –> TE’ T –> FT’ F –> (E) (2) (5) (8) E’ –> +TE’ T’ –> *FT’ F –> i (3) (6) E’ –> T’ –>

第五章自上而下语法分析

第五章自上而下语法分析

第五章⾃上⽽下语法分析第五章⾃上⽽下语法分析1、教学⽬的及要求:本章介绍编译程序的第⼆个阶段语法分析的设计⽅法和实现原理,包括⾃上⽽下分析的⽆回朔的递归下降分析、 LL(1)分析法。

要求理解递归下降分析、LL(1)⽂法的基本概念;掌握⽆回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析⽅法。

◇能够对⼀个给定的⽂法判断是否是LL(1)⽂法;◇能构造预测分析表;◇能⽤预测分析⽅法判断给定的输⼊符号串是否是该⽂法的句⼦;◇能对某些⾮LL(1)⽂法做等价变换:①消除左递归②提取左公共因⼦可能会变成LL(1)⽂法。

这样可扩⼤⾃顶向下分析⽅法的应⽤。

2、教学内容:语法分析器的功能,⾃上⽽下语法分析(递归下降分析法,预测分析程序),LL(1)分析法,递归下降分析程序构造,预测分析程序。

3、教学重点:递归下降⼦程序,预测分析表构造,LL(1)⽂法。

4、教学难点:对⼀个⽂法如何判断是否是LL(1)⽂法,由于在判断 LL(1)⽂法时⽤到⽂法符号串的开始符号集合(FIRST集)和⾮终结符后跟符号集合(FOLLOW集)的计算,⽽⼀般学⽣往往因概念不清或不够细⼼对这两个集合的计算常常出错,导致判断和分析结果的错误。

5、课前思考为了了解⾃顶向下(⾃上⽽下)分析的⼀般过程和问题,请学⽣⾸先回顾本章之前介绍的有关基本概念:◇句⼦、句型和语⾔的定义是什么?◇什么叫最左推导?◇什么叫最右推导和规范推导?◇什么叫确定的⾃顶向下语法分析?◇⾃顶向下语法分析是从⽂法的开始符号出发,反复使⽤各种产⽣式,寻找与输⼊符号匹配的推导。

◇确定的⾃顶向下语法分析中⽤的是哪种推导?◇在确定的⾃顶向下语法分析过程中,当以同⼀个⾮终结符为左部的产⽣式有多个不同右部时,如何选择⽤哪个产⽣式的右部替换当前的⾮终结符?◇确定的⾃顶向下语法分析对⽂法有何限制?6、章节内容第⼀节概述第⼆节 LL(1)分析⽅法第三节递归下降分析法5.1 概述LL分析法确定的⾃上⽽下分析⾃上⽽下分析递归下降分析法语法分析不确定的⾃上⽽下分析——即带回溯的分析⽅法算符优先分析⾃下⽽上分析LR分析⼀、带回溯的⾃顶向下分析⽅法是⾃顶向下分析的⼀般⽅法,即对任⼀输⼊符号串,试图⽤⼀切可能的办法,从树根结点(识别符号)出发,根据⽂法⾃上⽽下地为输⼊串建⽴⼀棵语法树,或者说,从识别符号开始,根据⽂法为输⼊串建⽴⼀个推导序列,这种分析过程本质上是⼀种试探过程,是反复使⽤不同规则谋求匹配输⼊串的过程。

编译原理-自上而下的语法分析

编译原理-自上而下的语法分析

高效性
由于从文法的最顶端开始分析, 一旦发现不匹配,就可以立即终 止当前分支的搜索,避免不必要 的计算,提高了编译器的效率。
易于处理左递归文

自上而下的分析方法可以很方便 地处理含有左递归的文法,而左 递归是许多实际编程语言的重要 特征。
局限性
无法处理左边界问题
自上而下的分析方法在处理某些含有左边界的文法时可能 会遇到问题,因为这种方法会优先匹配最左边的符号,而 左边界问题需要从右往左匹配符号。
案例三
在编译器优化中,自上而下的语法分析被用 于识别和修改源代码中的冗余和低效的语法 成分。例如,在C编译器的实现中,自上而 下的语法分析可以用于优化循环结构,减少 不必要的循环次数,提高程序的执行效率。
自上而下的语法分析还可以用于代码生成和 代码生成器的实现。通过识别和解析源代码 中的语法成分,可以生成更高效、更安全的 机器代码或字节码,提高程序的执行效率和
安全性。
THANKS
感谢观看
详细描述:递归下降分析算法易于理解,每个产生式规 则对应一个函数,函数的实现相对简单明了。
详细描述:对于每个产生式规则,需要编写相应的递归 函数,可能会导致代码冗余。
移入-规约分析算法
总结词
基于栈的算法
详细描述
移入-规约分析算法是一种自上而下的语法分 析算法,它将目标语句从左到右依次读入, 并根据文法的产生式规则进行移入或规约操 作,直到找到目标语句的语法结构。
词法分析
词法分析是编译过程的第一步,也称为扫描或词法扫描。它的任务是从左 到右读取源代码,将其分解成一个个的记号或符号。
词法分析器通常使用正则表达式或有限自动机来识别和生成记号,这些记 号可以是关键字、标识符、运算符、标点符号等。

第五章 语法分析(自上而下分析法)

第五章 语法分析(自上而下分析法)

解: 这里P=exp , α 1=+term , α 2=-term, β =term 改写: exp → term exp' , exp' → +term exp' | - term exp' | ε
(3)间接左递归的消除 例如文法G(S): S→Qc|c Q→Rb|b R→Sa|a
虽没有直接左递归,但S、Q、R都是左递归的
例:简单的表达式文法 exp → exp addop term | term 消除其左递归。 解:属于格式P → Pα | β 这里 P=exp , α =addop term , β =term 改写: exp → term exp' exp' → addop term exp' | ε
例 文法G(E): E→E+T | T T→T*F | F F→(E) | i 经消去直接左递归后变成: E→TE′ E′→+TE′ | ε T→FT′ T′→*FT′ | ε F→(E) | i 不变
例1 假定有文法G(S): (1) S→xAy (2) A→** | * 分析输入串x*y(记为α)。 ① 按文法的开始符号产生语法树的根节点S,根据规 则,S有三个子孙,于是此时的语法树如图所示; 并把指示器IP指向串α的第一个符号x x*y IP S x*y IP S x A y
把语法树的子节点从左至右对IP所指向的符号进行匹 配。第一符号匹配,于是,IP向后移动一个符号。
是递归下降分析法和预测分析法的基础
LL(1)分析法
构造不带回溯的自上而下分析算法 要消除文法的左递归性 克服回溯
1 左递归的消除
(1)简单直接左递归 直接消除见诸于产生式中的左递归:假定关于非 终结符P的规则为

编译原理-第五章习题答案

编译原理-第五章习题答案

上一页
下一页
11
例:5.3 文法:SaAcBe A bAb B d 句子:abbcde
步骤 (1) (2) (3) (4) (5) (6)

# #a #ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
输入 abbcde# bbcde# bcde# bcde# cde# cde#
上一页
下一页
20
5)构造算符优先文法G的优先表的算法
思路:对文法中的每一个产生式的候选式检查,判断句型中相邻符号之间 的关系 来构造优先表; 具体算法: FOR 每条产生式P→X1X2…Xn FOR i=1 TO n-1 IF Xi,Xi+1∈VT,THEN Xi=Xi+1; IF i ≤n-2且Xi,Xi+2∈VT,Xi+1∈VN THEN Xi=Xi+2; IF Xi∈VT,Xi+1∈VN THEN FOR FIRSTVT(Xi+1)中的每个a Xi <. a; NEXT IF Xi∈VN,Xi+1∈VT THEN FOR LASTVT(Xi)中的每个a DO a .> Xi+1; NEXT NEXT NEXT

上一页
下一页
8
例:5.1 P85 文法: E→T|E+T T→F|T*F F→i|(E) 句型:i1*i2+i3其中:短语有i1、i2、i3、i1*i2、 i1*i2+i3 直接短语:i1、i2、i3;句柄:i1 例:5.2 P85 文法如上 E 句型:E+T*F+i 短语:E+T*F+i,E+T*F,T*F,i 直接短语:T*F和i E + 句柄:T*F

自上而下语法分析

自上而下语法分析
<复合语句>::=begin<语句表>end <语句表>::=<语句>{;<语句>} <标识符表>::=<标识符>{,<标识符>}
<语句>::=<标识符>:=<表达式> |<复合语句> |if <条件表达式>then<语句>[else<语句>] |while<条件表达式>do<语句> |read(<标识符表>) |write(<标识符表>)
5.2
8、构造算符优先分析表 : (1)拓广文法,增加产生式S’→#S#; (2) 计算每个非终结符的firstvt和lastvt; (3) 列表。
二、算符优先分析的若干问题
左符 右符 + * ( ) i
+

*





函数说明>}
<常量定义>::=const<标识符>=<无符号数>{(,|;) <标
识符>=<无符号数>}
<变量说明>::=var<标识符>:integer{;<标识符表>:integer} <函数说明>::= function<标识符>[(<标识符表>
:integer)] :integer;<分程序>
5.2 算符优先分析法
一、算符优先文法及优先表的构造 二、算符优先分析的若干问题 三、优先函数
5.2 算符优先分析法

编译原理第三版 第五章 自下而上语法分析

编译原理第三版 第五章 自下而上语法分析
3. 归 (2) 4. 进 b 5. 归 (3) 6. 进 c 7. 进 d 8. 归 (4) 9. 进 e 10. 归 (1)
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) #看作终结符号

编译原理 第五章 语法分析-自下而上分析

编译原理 第五章 语法分析-自下而上分析

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.3.3.1 单个文法符号的FIRST集
FIRST定义:
FIRST() ={a| aβ, a ∈VT, β ∈ Σ*} 若 , 则规定∈ FIRST() 。
2. 消除间接左递归(代入法)
间接左递归的消除需先将间接左递归变为直接 左递归,然后再按第1种方法消除直接左递归 如:文法 G: S→Q | b 可改写为: Q →Pβ | b
5.3.1 左递归的N N替换为N 的候选式。如果N有n个候选式,右边重复n 次,而且每一次重复都有N的不同候选式来代 替N。
第5章 自顶向下语法分析方法
内容
语法分析的任务与分类 自上而下分析面临的问题 LL(1)分析法 递归下降分析程序构造 预测分析程序
5.1 语法分析的任务与分类
1. 任务 对于一个给定w∈VT*,判断w∈L(G)
工作本质:根据产生式识别输入串是否为 一个句子。 2. 语法分析器:是一个程序,它按照P,做 识别w的工作。语法分析只管w在形式上是 否正确,不管其具体含义,比如:“虎打 武松”。
不同排序所得的文法的等价性是显然的
习题1
5.3.1 左递归的消除
A→aB|Bb B→Ac|d
消去该文法的左递归。
习题2 消去文法G[S]: S →Sa|Ab|a A→Sc
的左递归。
5.3.2 回溯的消除
回溯
若当前符号为:a,对A展开,而A→ 1 | 2 | … | n,那 么,要知道哪一个 i是获得以a开头的串的唯一替换式。
化简由第二步所得的文法 即去除那些从开始符号出发永远无法到达的非终结符的产生规则
5.3.1 左递归的消除
例5.3 考虑文法G(S) S→Qc|c Q→Rb|b R→Sa|a

第5章自上而下语法分析

第5章自上而下语法分析

否则 S L(G[Z])
存在主要问题: • 句柄的识别问题
主要方法: • 算法优先分析法 • LR分析法
3 3
1 .
自上而下分析的一般过程
给定符号串S,若预测是某一语法成分, 那么可根据该语法成分的文法,设法为S构造一棵语法树.
若成功,则S最终被识别为某一语法成分,即 SL(G[Z])其中G[Z]为某语言成分的文法. 若不成功,则 SL(G[Z])
21
5.2 LL(1)分析法
LL(k)文法是一种自上而下语法分析方法.它是从文
法的识别符号出发,生成句子的最左推导.它从左到右 扫描源程序,每次向前查看k(k>1)个字符,便能确定当 前应该选择的产生式,如果每次只向前查看一个字符, 则称为LL(1)文法.
22
5.2 LL(1)分析法
设有文法G[Z]: 定义:α是文法G的一个符号串 FIRST(α) = {a | α * aβ, a Vt , α,β V*}
消 除 所 有 左 递 归 的 算 法
14
例:文法G[s]为 S →Qc|c Q →Rb|b R →Sa|a
非终结符顺序 重新排列
R→Sa|a Q→Rb|b S→Qc|c
该文法是无直接左递归,但有间接左递归 SQc Rbc Sabc ∴S+ Sabc
1.检查规则R是否存在直接左递归
2.把R代入Q的有关选择,改写规则Q 3.检查Q是否直接左递归
c A d
5
5
S=cad 3. 选用A的右部符号串匹配输入串 A有两个右部,选第一个
G[Z]: Z→cAd A→ab|a
Z ·
c A d a Z · c A d b
完成进一步推导Aab 检查,a-a匹配,b-d不匹配(失败) 但是还不能冒然宣布SL(G[Z]) 4. 回溯 即砍掉A的子树 改选A的第二右部 Aa 检查 a-a匹配 d-d匹配

自上而下语法分析

自上而下语法分析
(q,ax,Zh′)├(p,x,hh′)
是一次可能的移动,当且仅当(p,h)∈δ(q,a,Z) 。 • 常用├+表示由一次或多次移动组成的序列。用├*表
示由零次或多次移动组成的序列。注意“零”次移 动并不改变当前的构形。
5.1.2 PDA的 构形和移动
• PDA M 所识别的语言L(M)可表示为: L(M)= {ω*︱(P0,ω,Z0)├*(P,,)}(空栈接收)
给定g中的任何句型xh如果x是一个终结符串而且h中至多最左符号是终结符那么qyh是该ndpda的一个构形而且52消除左递归方法521文法的左递归性文法的左递归性属文法递归性的一种在一文法中所有形如axay若其中x则有aay称之为直接左递归产生式
第五章 自上而下语法分析
• 语法分析是继词法分析之后编译过程的第2阶 段。它的主要任务是对词法分析的输出结 果——单词序列进行分析,识别合法的语法 单位。
如果x是一个终结符串,而且h中至多最左符号是
终结符,那么,(q,y,h)是该NDPDA的一个构形,
而且
(q,xy,S)├*(q,y,h)
5.2 消除左递归方法
5.2.1 文法的左递归性
• 文法的左递归性属文法递归性的一种, 在一文法中,所有形如
A→xAy x,y ∈(∑∪N) *,A∈N
称为递归产生式(或自嵌入产生式)。 • 若其中x=ε,则有
由行1
• (p,00,GGBBR) ├
或 ├(Q,001100,ε) 由行7(阻
(p,0,BGGBBR) 由行4
塞)
• (p,0,BGGBBR) ├
• (p,01100,BR) ├
(p,ε,BBGGBBR) 由行3a(阻塞)
(p,1100,BBR) 由行3a

编译原理第五章语法分析——自下而上分析

编译原理第五章语法分析——自下而上分析

第五章语法分析——自下而上分析要紧内容:[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. LR分析法分析过程;4. 语法分析器自动产生工具Y ACC;5. LR分析过程中的出错处理。

本章目标掌握和理解自下而上分析的基本问题、算符优先分析、LR分析法及语法分析器的自动产生工具YACC等内容。

本章重点1.自下而上语法分析的基本概念:归约、句柄、最左素短语;2.算符优先分析方法:FirstVT, LastVT集的计算,算符优先表的构造,工作原理;3.LR分析器:(1)LR(0)项目集族,LR(1)项目集簇;(2)LR(0)、SLR、LR(1)和LALR(1)分析表的构造;(3)LR分析的基本原理,分析过程;4.LR方法如何用于二义文法;本章难点1. 句柄的概念;2. 算符优先分析法;3. LR分析器基本;作业题一、单项选择题:1. LR语法分析栈中存放的状态是识别________的DFA状态。

a. 前缀;b. 可归前缀;c. 项目;d. 句柄;2. 算符优先分析法每次都是对________进行归约:(a)句柄(b)最左素短语(c)素短语(d)简单短语3. 有文法G=({S},{a},{S→SaS,S→ε},S),该文法是________。

a. LL(1)文法;b.二义性文法;c.算符优先文法;d.SLR(1)文法;4. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LL(1)分析法属于自顶向下分析;a. 深度分析法b. 宽度优先分析法c. 算符优先分析法d. 递归下降子程序分析法5. 自底向上语法分析采用分析法,常用的是自底向上语法分析有算符优先分析法和LR分析法。

a. 递归b. 回溯c. 枚举d. 移进-归约6. 一个LR(k)文法,无论k取多大,。

a. 都是无二义性的;b. 都是二义性的;c. 一部分是二义性的;d. 无法判定二义性;7. 在编译程序中,语法分析分为自顶向下分析和自底向上分析两类,和LR分析法属于自底向上分析。

第五章语法分析—自下而上分.pptx

第五章语法分析—自下而上分.pptx
第五章 语法分析—自下而上分析
自下而上分析法:即是从输入串开始,逐步进行 “”,直至归约到文法的开始符号; 或者说,从语法树的末端开始,逐步向 上“”,直到根结点。
第五章 语法分析—自下而上分析
5.1 自下而上分析基本问题 5.2 算符优先分析 5.3 LR分析法 5.4 语法分析器的自动产生工具YACC
F
5.2 算符优先分析
算符优先分析: 不是一种规范归约法,是一种自下而上的语法
分析法,关键在于规定算符(即终结符)之间的优 先顺序和结合性质,借助这种优先关系寻找“可归 约串”进行归约。
特点:有利于表达式分析,宜于手工实现。
5.2 算符优先分析
算符优先分析法是自底向上分析方法中的一种, 虽然它不是规范归约,但它具有分析速度快,特别 适合表达式分析的特点,因而得到普遍应用。
#N1a1N2a2… aj-1

ai+1 … NnanNn+1#
一个算符优先文法G的任何句型的最左素短语是满
足如下条件的最左子串:Njaj…NiaiNi+1 aj-1⋖ aj
5.2 算符优先分析
2.算法
过程:读入一个输入符号a, 然后比较栈顶终结符—a。
S[]—存放“文法符号”的分析栈 j—始终指向VT符号 k—始终指向栈顶 a—存放“输入符号”的字符变量
{*,↑,(,i}
FIRSTVT(T){↑, (,i}
LASTVT(E {+,*,↑,),i}
)=
{*,↑,),i}
LASTVT(T {↑, ),i}
5.2 算符优先分析
2.构造优先表
(1)a≖b:找出满足“≖ ”的所有终结符对。
(2)a⋖b,a⋗b:找出满足“⋖”和“⋗”的所有终结符
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
◇ 能够对一个给定的文法判断是否是 LL(1)文法; ◇ 能构造预测分析表; ◇ 能用预测分析方法判断给定的输入符号串是否是该文法的句子; ◇ 能对某些非 LL(1)文法做等价变换:
① 消除左递归 ② 提取左公共因子 可能会变成 LL(1)文法。这样可扩大自顶向下分析方法的应用。 2、教学内容: 语法分析器的功能,自上而下语法分析(递归下降分析法,预测分析程序),LL(1) 分析法,递归下降分析程序构造,预测分析程序。 3、教学重点: 递归下降子程序,预测分析表构造,LL(1)文法。 4、教学难点: 对一个文法如何判断是否是 LL(1)文法,由于在判断 LL(1)文法时用到文法符号串 的开始符号集合(FIRST 集)和非终结符后跟符号集合(FOLLOW 集)的计算,而一般学 生往往因概念不清或不够细心对这两个集合的计算常常出错,导致判断和分析结果的错 误。 5、课前思考 为了了解自顶向下(自上而下)分析的一般过程和问题,请学生首先回顾本章之前 介绍的有关基本概念: ◇ 句子、句型和语言的定义是什么? ◇ 什么叫最左推导? ◇ 什么叫最右推导和规范推导? ◇ 什么叫确定的自顶向下语法分析?
四、LL(1)文法的判别 选用自顶向下分析技术时,首先必须判别所给文法是否为 LL(1)文法,因而对任意
给定文法需计算 FIRST,FOLLOW,SELECT 集合,进而判别文法是否为 LL(1)文法。 例:文法 G[S]为:
SAB|bC,A|b,B|aD,CAD|b,DaS|c 解:(第一步)计算能推出 的非终结符
1
第五章 自上而下语法分析
◇ 自顶向下语法分析是从文法的开始符号出发,反复使用各种产生式,寻找与输 入符号匹配的推导。
◇ 确定的自顶向下语法分析中用的是哪种推导? ◇ 在确定的自顶向下语法分析过程中,当以同一个非终结符为左部的产生式有多 个不同右部时,如何选择用哪个产生式的右部替换当前的非终结符? ◇ 确定的自顶向下语法分析对文法有何限制? 6、章节内容 第一节 概述 第二节 LL(1)分析方法 第三节 递归下降分析法
行与文法的一个非终结符号相关联,而每一列则与文法的一个终结符号或#有关。 ➢ 分析表元素 M[A,a],其中 AVN ,a VT {#},指示了分析器应采取的动作。 2、工作过程
分析器对每一输入串的分析均在总控程序控制下进行,算法: 第一步:分析开始时,首先将符号#及文法的开始符号 S 依次放置于分析栈的底部, 并把各指示器调整至起始位置,即起始格局如下图,然后反复执行第二步所列的工作。
第五章 自上而下语法分析
第五章 自上而下语法分析
1、教学目的及要求: 本章介绍编译程序的第二个阶段语法分析的设计方法和实现原理,包括自上而下分
析的无回朔的递归下降分析、 LL(1)分析法。要求理解递归下降分析、LL(1)文法的基 本概念;掌握无回朔的递归下降分析的设计和实现、LL(1)分析表的构造与分析方法。
▪ 若某一非终结符的某一产生式右部为 ,将数组中对应该非终结符的标记置为 “是”,并从文法中删除该终结符的所有产生式。
(3)扫描产生式右部的每一符号; ▪ 若所扫描到的非终结符在数组中对应的标志是“是”,则删去该非终结符,若使 产生式右部为空,则对产生式左部的非终结符在数组中对应的标志改为“是”, 并删除该非终结符为左部的所有产生式。 ▪ 若所扫描到的非终结符号在数组中对应的标志是“否”,则删去该产生式,若使 产生式左部非终结符的有关产生式都被删去,则把在数组中该非终结符对应的标 志改为“否“。
练习:有文法 G[S]: SaAS|b,AbA| 判断是否为 LL(1)文法
SELECT(SaAS)=FIRST(aAS)={a} SELECT(Sb)=FIRST(b)={b} SELECT(AbA)=FIRST(bA)={b} SELECT(A)=FIRST()FOLLOW(A)={a,b} 而 SELECT(AbA)SELECT(A)={b} 所以,该文法不是 LL(1)文法。
用一个一维数组表示:建立一个以文法的非终结符个数为上界的一维数组,其数组 元素为非终结符,对应每一非终结符有一标志位,用以记录能否推出 ,其值有三种情 况:“未定”,“是”,“否”。
计算能推出 的非终结符的步骤: (1)将数组中对应每一非终结符的标记置为“未定”; (2)扫描文法中的产生式;
▪ 删除所有右部含有终结符的产生式,若使得某一非终结符为左部的所有产生式都 被删除,则将数组中对应该非终结符的标记置为否,说明该非终结符不能推出 。
▪ 若 Xm= ai=#,输入串已完全得到匹配,此时即可宣告分析成功而结束分析工作。
▪ 在上述分析的每一步,可视需要附加相应的处理工作。
4
第五章 自上而下语法分析
例:考虑文法 G[E]:ETE’,E’+TE’,E’,TFT’,T’FT’,T’*FT’|, F (E)|i 该文法的分析表如下,分析符号串 i+i*i。
例有文法 G[S]:S→cAd,A→ab|a,输入串 w=cad。其分析过程为带回溯的。
二、 存在问题及解决办法
1、左递归问题:
自顶向下分析方法只有把规则排列得合适时才能正确工作,该方法不能处理具有左 递归性文法,可采取某些算法消除左递归。
2、回溯问题:
2
第五章 自上而下语法分析
回溯问题因语法及与语法分析同时进行的语义分析等工作导致该方法效率低、代价 高,故必须消除回溯。 3、为避免回溯,对文法可提出相应要求: ➢ 设文法是不具有左递归性的文法,U 为文法 G 的任意非终结符,即 UVN,并假定 U
i
+
*
(
)
#
E TE’
TE’
E’
+TE’
T FT’
FT’
T’
*FT’
F i
(E)
步骤 分析栈
1 #E 2 #E’T 3 #E’T’F 4 #E’T’i 5 #E’T’ 6 #E’ 7 #E’T+ 8 #E’T 9 #E’T’F 10 #E’T’i 11 #E’T’ 12 #E’T’F* 13 #E’T’F 14 #E’T’i 15 #E’T’ 16 #E’ 17 #
5.2 LL(1)分析方法
一、LL(1)分析方法
是实现自顶向下分析的一种方法,相应的语法分析将按自左向右的顺序扫描输入符
号串,并在此过程中产生一个句子的最左推导。使用该方法,借助于一张分析表及一个
语法分析栈,在一个总控程序控制下很容易实现。以下是 LL(1)分析器的逻辑结构及工
作过程:
a1 a2 ... ai ... an #
SELECT(A) SELECT(A)= 其中 , 不能同时推导出 。
例:设文法 G[S]:SaA|d,AbAS| 解:因为 SELECT(SaA)=FIRST(aA)={a}
SELECT(Sd)=FIRST(d)={d} SELECT(AbAS)=FIRST(bAS)={b} SELECT(A)=FIRST()FOLLOW(A)={#,a,d} 所以, SELECT(SaA)SELECT(Sd)= {a} {d}= SELECT(AbAS)SELECT(A)={b} {#,a,d}= 故该文法为 LL(1)文法,可用确定的自顶向下分析法。
5.1 概述
LL 分析法
确定的自上而下分析
自上而下分析
递归下降分析法
语法分析
不确定的自上而下分析——即带回溯的分析方法
算符优先分析
自下而上分析
LR 分析
一、带回溯的自顶向下分析方法
是自顶向下分析的一般方法,即对任一输入符号串,试图用一切可能的办法,从树 根结点(识别符号)出发,根据文法自上而下地为输入串建立一棵语法树,或者说,从 识别符号开始,根据文法为输入串建立一个推导序列,这种分析过程本质上是一种试探 过程,是反复使用不同规则谋求匹配输入串的过程。
输入
分析表MБайду номын сангаас
总控程序
…...
x
#
分析栈 3
第五章 自上而下语法分析
二、LL(1)分析器的逻辑结构及工作过程 1、逻辑结构
逻辑上,LL(1)分析器由一个总控程序、一张分析表和一个分析栈组成。其中: ➢ “输入”即待分析的符号串(其中#VT),在输入串的末尾放置一个#,仅为分析算
法格式的统一。 ➢ 分析表 M 可用一个矩阵或二维数组表示,概括了相应文法的全部信息,矩阵的每一
有如下规则 U1| 2|…| n,该规则右部有 n 个选择,从每一个选择出发,都可 以推导一个以上的终结符号串,定义任一个选择 i 的所有可能推出的终结符号串的 首符号集 FIRST(i), FIRST(i)={a| i* a…,a VT}。 ➢ 为避免回溯,须保证当非终结符 U 去匹配输入串时,能够根据当时读入的符号准确 地选用它的一个选择去执行任务,因此,为实现该目的,对文法的要求是:FIRST(i) FIRST(j)=(ij),即对文法中的任一个非终结符,其规则右部有多个选择时,由 各个选择所推出的终结符号串的头符号集要两两不相交。 ➢ 这样,可根据当时读入的符号属于哪个选择的 FIRST()来唯一的确定应该选用哪个 选择匹配输入串,如当前的输入符号为 b(bVT), 若 bFIRST(i),则用第 i 个选择; 若 bFIRST(i),i=1...n,则语法错,转出错处理,避免分析过程的回溯。 4、为实现不带回溯的自顶向下分析,对文法来说需满足下述两个条件: ➢ 文法是非左递归的; ➢ 对文法的任一非终结符号,若其规则右部有多个选择时,则每个选择所推出的终结 符号串的头符号集两两不相交。
1、设 G=(VN,VT,P,S)是上下文无关文法,FIRST()={a|a,aVT, V*} 若 * ,则规定 FIRST()
FIRST()是 的所有可能推导的起始终结符或可能的 。
2、设 G=(VN,VT,P,S)是上下文无关文法,AVN, S 是开始符号, FOLLOW(A)={a|S* A,且 aVT , aFIRST(), V*, V+}
相关文档
最新文档