自上而下语法分析

合集下载

语法分析自上而下分析

语法分析自上而下分析
(), ∈V*, ∈V+ } 若S u A ,且 ε ,则#∈FOLLOW(A)
2019/9/8
中南大学软件学院 陈志刚
23
第四章 语法分析-自上而下分析
计算FIRST集
1.若XV,则FIRST(X)={X}
2.若XVN,且有产生式Xa…,则把a加入到 FIRST(X)中;若X也是一条产生式,则把也 加到FIRST(X)中.
2019/9/8
中南大学软件学院 陈志刚
20
第四章 语法分析-自上而下分析
1、LL(1)分析法的工作过程
开始往栈stack中放“#”,然后把文件开 始符号压栈。预测分析程序总是按stack栈顶符 号X和当前输入符号a行事。 ① 若X=a=”#”,则分析成功,停止分析 ② 若X=a”#”,则把X从栈顶弹出,a指向下一个
2019/9/8
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
中南大学软件学院 陈志刚
10
第四章 语法分析-自上而下分析
其次,由于回溯就碰到一大堆麻烦事情。如果 我们走了一大段错路,最后必须回头,那么, 就应把已经做的一大堆语义工作推倒重来。
第三,在上述的自上而下分析过程中,当一个 非终结符用某一个候选匹配成功时,这种成功 可能仅是暂时的。
第四,当最终报告分析不成功时,我们难于知 道输入串中出错的确切位置。

编译原理张晶版 第四章 自上而下语法分析

编译原理张晶版 第四章 自上而下语法分析

1、消除左递归
•1) 什么是左递归 —左递归:文法存在产生式 P + Pa —直接左递归: P —间接左递归:P Pa Aa ,A + Pb
•2)消除左递归
—消除直接左递归 —消除间接左递归
第四章 自上而下语法分析(23)
第二节 自上而下分析法的一般问题 三、不带回溯的自上而下分析算法
2、消除直接左递归
第四章 自上而下语法分析(44)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TE’
*FT’ (E)
3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(45)
第四章 自上而下语法分析(47)
第三节 预测分析程序与LL(1)文法 二、求串a的终结首符集和非终结符A的随符集
例:对如下文法G(已加上编号)
1. E
4. T 7. F
TE’
FT’ i
2. E’
5. T’ 8. F
+TBiblioteka ’*FT’ (E)3.E’
6.T’
e
e
求各非终结符号的终结首符集和随符集
第四章 自上而下语法分析(48)
第四章 自上而下语法分析(40)
第三节 预测分析程序与LL(1)文法 三、构造预测分析表
1. 基本思想 1)若A a是一个产生式,a ∈ First(a),那么当A 是栈顶符号且将读入a时,选择a取代A匹配成功的 希望最大,故,M[A,a]元素为A a 2)若A a而a=e,或a + e;当A是栈顶符号且将读 入a时,若a ∈ Follow(A),则栈顶的A应被e匹配; 此时读头不前进,让A的随符与读头下的符号进行 匹配,这样输入串匹配成功的可能最大,故M[A,a] 元素为A a(这里a=e或a + e)

第四章 语法分析——自上而下分析

第四章 语法分析——自上而下分析

解二: 规定顺序:S、Q、R
则等价的无左递归的文法: SQc | c QRb| b RbcaR’ | caR’ | aR’ R’bcaR’ |
RSa | a RQca | ca | a
RRbca|bca | ca | a
RbcaR’|caR’ | aR’ R’ bcaR’|
(因为不需要试探某个候选式,而是准确地指派 某个候选式)
17
终结首符集FIRST
令文法G不含左递归,对它的所有非终结符的每 个候选式定义终结首符集 FIRST(): * FIRST()={a | a , a∈VT }
特别地 * 若 ,则规定 ∈ FIRST()
显然, FIRST()是从推导出的所有可能的开头终 结符a或 。
3
§4.2 自上而下分析面临的问题
一、带‚回溯‛的自上而下分析方法:
自上而下分析方法,就是对任何输入串,试 图用一切可能的方法,从文法的开始符号出发, 自上而下地为输入串建立一个语法树(或最左推 导)。 这种分析过程实质上是一种试探过程,即反 复使用不同的产生式以求能匹配输入串。
4
例4.1 设有文法: SxAy
解: S iCtSA | a
A | eS
C b
22
4.3.3 LL(1)分析条件 当一个文法不含左递归,并且满足每个非终结 符的所有候选首符集两两不相交,是不是一定能进 行有效的自上而下的语法分析呢?
若存在 ∈ FIRST() ,则问题较复杂,需要进 一步考虑。 定义:非终结符A的 FOLLOW 集:
* FOLLOW(A)= { a| S …Aa… ,a∈VT } 特别地, * 若S …A,则规定,构造FIRST(X)
a) 若X∈VT,则 FIRST(X)={X}。

第五章自上而下语法分析

第五章自上而下语法分析

第五章⾃上⽽下语法分析第五章⾃上⽽下语法分析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分析⼀、带回溯的⾃顶向下分析⽅法是⾃顶向下分析的⼀般⽅法,即对任⼀输⼊符号串,试图⽤⼀切可能的办法,从树根结点(识别符号)出发,根据⽂法⾃上⽽下地为输⼊串建⽴⼀棵语法树,或者说,从识别符号开始,根据⽂法为输⼊串建⽴⼀个推导序列,这种分析过程本质上是⼀种试探过程,是反复使⽤不同规则谋求匹配输⼊串的过程。

语法分析—自上而下分析

语法分析—自上而下分析
是一种试探过程,是反复使用不同产生 式谋求匹配输入串的过程。
9
§4.2 自上而下面临的问题
例:文法 SxAy A**|*
输入串α :x*y
S x Ay
S x Ay **
S x Ay
*
10
注:
• 回溯法也称试探法,它的基本思想是:从问题的 某一种状态(初始状态)出发,搜索从这种状态 出发所能达到的所有“状态”,当一条路走到“ 尽头”的时候(不能再前进),再后退一步或若 干步,从另一种可能“状态”出发,继续搜索, 直到所有的“路径”(状态)都试探过。这种不 断“前进”、不断“回溯”寻找解的方法,就称 作“回溯法”。
三、分析条件
1.当一个文法不含左递归,并且满足每个非终结符的 所有候选首符集两两不相交的条件,是不是就一定能 进行有效的自上而下分析了呢?
28
§4.3 LL(1)分析法
例:文法
EE+T|T TT*F|F F(E)|i
E T E’
经消去直接左递归后变成 ETE’ E’+TE’|ℇ TFT’ T’*FT’|ℇ F(E) |i
FIRST(A)
2.A→ε
3.A→X1 X2......XK
*
(1) * a..X2....... FIRST(X1)/{ε}
(2) * ε X2.......
FIRST(X2)/{ε}
ε
(3) * εε......ε
36
FIRST集
1.First(X)集合构造,X∈VT∪VN
例:求下题的FIRST集
25
§4.3 LL(1)分析法
3.提取公共左因子 A.事实上,许多文法均存在这样的非终结符,
其所有候选的终结首符集并非两两不相交。

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

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

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

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

语法分析最常用的两类方法

语法分析最常用的两类方法

LL分析法和LR分析法。

1、自上而下语法分析方法(LL分析法)
给定文法G和源程序串r。

从G的开始符号S出发,通过反复使用产生式对句型中的非终结符进行替换(推导),逐步推导出r 。

是一种产生的方法,面向目标的方法。

分析的主旨为选择产生式的合适的侯选式进行推导,逐步使推导结果与r匹配。

2、自下而上语法分析方法(LR分析法)
从给定的输入串r开始,不断寻找子串与文法G中某个产生式P的候选式进行匹配,并用P的左部代替(归约)之,逐步归约到开始符号S。

是一种辨认的方法,基于目标的方法。

分析的主旨为寻找合适的子串与P的侯选式进行匹配,直到归约到G的S为止。

扩展资料
LALR分析器可以对上下无关文法进行语法分析。

LALR即“Look-AheadLR”。

其中,Look-Ahead为“向前看”,L代表对输入进行从左到右的检查,R代表反向构造出最右推导序列。

LALR分析器可以根据一种程序设计语言的正式语法的产生式而对一段文本程序输入进行语法分析,从而在语法层面上判断输入程序是否合法。

实际应用中的LALR分析器并不是由人手工写成的,而是由类似于yacc和GNU Bison之类的LALR语法分析器生成工具构成。

由机器自动生成的代码相比较于程序员手工的代码,拥有更好的运行效率而且减少了程序员的工作量。

自上而下语法实验报告

自上而下语法实验报告

自上而下语法分析自上而下语法分析一、实验目的:1、根据某一文法编制调试递归下降分析程序,对任意输入的符号串进行分析。

、根据某一文法编制调试递归下降分析程序,对任意输入的符号串进行分析。

2、根据某一文法编制调试LL LL((1)分析程序,对任意输入的符号串进行分析。

)分析程序,对任意输入的符号串进行分析。

3、本次实验的目的主要是加深对自上而下分析法的理解。

、本次实验的目的主要是加深对自上而下分析法的理解。

二、实验内容:(一)程序的功能描述(一)程序的功能描述LL LL((1)分析法的功能是利用LL LL((1)控制程序根据显示栈栈顶内容、向前看符号以及LL LL((1)分析表,对输入符号串自上而下的分析过程。

具体描述如下:)分析表,对输入符号串自上而下的分析过程。

具体描述如下: 对下列文法,对任意输入的符号串进行分析:对下列文法,对任意输入的符号串进行分析:(1)E->TG (2)G->+TG (3)G->ε(4)T->FS (5)S->*FS (6)S->ε (7)F->(E) (8)F->i输入一以输入一以##结束的符号串结束的符号串((包括包括++—*/*/()()()i#)i#)i#)::输出结果:包括分析栈、数组中的剩余字符串以及所用的产生式,形如:输出结果:包括分析栈、数组中的剩余字符串以及所用的产生式,形如:分析栈分析栈 剩余输入串剩余输入串 所用产生式所用产生式 E i+i*i# E->TG其中有如下两点要求:其中有如下两点要求: 1.1.表达式中允许使用运算符(表达式中允许使用运算符(表达式中允许使用运算符(+-*/+-*/+-*/))、分割符(括号)、字符I ,结束符,结束符##; 2.2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);(二)(二)LL LL LL((1)分析法实验设计思想及算法)分析法实验设计思想及算法三、程序设计的过程以及关键函数的功能 (一)模块结构:(一)模块结构:1、定义部分:定义常量、变量、数据结构。

my第04章-语法分析:自上而下

my第04章-语法分析:自上而下

自上而下分析法的一般问题
3.
带回溯的自上而下分析法的缺陷 1)如果文法存在左递归,语法分析会无限循环下去。 2)若产生式存在多个候选式,选择哪个进行推导完全 是盲目的。 3)回溯会引起时间和空间的打量消耗 4)如果被识别的语句是错的,算法无法指出错误的确 切位置。
第四章 语法分析--自上而下分析
直接左递归,和非直接左递归的消除方法均在必须掌握之列。这里我们 切不可被形式描述消除左递归的算法吓倒,多做几个例题后再来理解是很 有好处的: [例4.3]: 考虑文法:SQc|c Q Rb|b R Sa|a 消除左递归。 解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入到Q 中有关的候选式: Q Sab|ab|b 现在Q同样不含直接左递归,把它带入S的有关候选式: S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法 S abcS’|bcS’|cS’ S’ abcS’| Q Sab|ab|b R Sa|a 由于关于Q,R的规则式多余的则可化简
本节要 掌握对给定文法构造出每个非终结符的 FIRST和FOLLOW集合。
第四章 语法分析--自上而下分析
掌握LL(1)预测分析表的构造,请参看4。5。1 预测分析程序的 工作过程(P76)和 4。5。2预测分析表的构造(P78)。 现在举一些例子帮助同学们理解: [例4.7 ]对于文法 ETE’ E’ +TE’| T FT’ T’ *FT’| F (E)| i 我们构造每个非终结符的FIRST和FOLLOW集合 解:FIRST(E) = { (, i } FOLLOW(E) ={ ), # } FIRST(E’) = {+, } FOLLOW(E’) = { ), #} FIRST(T) = {(, i } FOLLOW(T) = {+, ), # } FIRST(T’) = {*, } FOLLOW(T’) ={+ , ), # } FIRST(F) = {(, i } FOLLOW(F) ={*, +, ) , # } 在这里我们要注意FOLLOW(F)的求解过程其中: FOLLOW(F)=FIRST(T’)={*}; 因为T’ ,所以将FOLLOE(T)加 到FOLLOW(F)中 (由于TFT’), 则: FOLLOW(F)=FOLLOW(T)=FIRST(E‘)={+}

编译原理LL(K)

编译原理LL(K)
S a a A b c b a A S b c
S =>aAbc =>ababc 错误回退 ,再回退S 错误回退A,再回退
重复以上匹配过程,发现此时符号串abeB与abed 前3个符号均匹配,下面指针指向第四个符号d。 而符号串abeB 的第四个符号是B,若选择 B→ d 则得到下面语法树: S =>aB =>abeB =>abed
圆括号( ③ 圆括号( ) 利用圆括号可提出一个非终结符的多个产生式右部 的公共因子。例如, A→xy|xw|…|xz 可写成 A→x(y|w|…|z)
利用下面的两条规则,可把包含直接左递归 的产生式转换成用扩展BNF表示法表示的产生 式。
① 提公因子 每当一条产生式中有公因子可提的时候,就把它 提出来,若原产生式是 A→x|xy 则可写成 A→x(y|ε) A→x(y|ε),这里把ε当作最后一个 候选式。 这样,把本来具有相同开始符号的候选式 变成了开始符号不同的候选式,从而避免了实现 分析过程中的逐个试探,并且有助于消除文法的 直接左递归,同时也压缩了文法的长度。
end; 消除Ui Ui产生式中的直接左递归 消除Ui产生式中的直接左递归 end; 化简改写之后的文法,删除多余产生式。 ③ 化简改写之后的文法,删除多余产生式。
确定的自顶向下语法分析
4.4
LL(k)文法 LL(k)文法
LL(k)文法是上下文无关文法的一个真子集。同时, LL(k)文法也是允许采用确定的从左至右扫描(输入 串)和自上而下分析技术的最大一类文法。 LL系指:自左至右扫描(输入串),自上而下进行最 左推导。 分析过程中,如果每步仅利用当前的非终结符(事 实上已经位于栈顶)和至多向前查看k个输入符号 就能唯一确定采取什么动作 唯一确定采取什么动作,则这个文法称为LL(k) 唯一确定采取什么动作 文法。 下面主要讨论k=0,1时的情形。

自上而下的语法分析

自上而下的语法分析

非终结符
初值 第1次扫描 第2次扫描
M
未定
T
B
D
未定

未定

未定


SELECT(T→Ba)={d,e,b,a,ε} SELECT(T→ε) = {d,e,b,a,#} 这两者的交集不为 ∅ 。 故该文法不是 LL(1) 文法。
5.5.2 LL(1)分析一般过程
给定文法: S → aSbS|ε 。求符号串 ab 的 LL(1) 分析过程。
* FIRST(A)= {a|A = a…,且 a∈VT } >
求FIRST集合
G: M T B D
文法规则
→ TB → Ba|ε → Db|eT|ε → d|ε
第一遍 第二遍 第三遍
M T T B B B D D
→ TB → Ba →ε → Db → eT →ε →d →ε
F(M)={ } F(T)={ } F(T)={ε} F(B)={ } F(B)={e} F(B)={e,ε} F(D)={d} F(D)={d,ε}
G2[S]: S→Ap S→Bq A→cA A→a B→dB B→b FIRST(Ap) = { a,c } FIRST(Bq) = { b,d } FIRST(S) = FIRST(Ap) ∪FIRST(Bq) = { a,b,c,d }
SБайду номын сангаас
A p
G3[S]: S→aA S→d A→bAS A→ε
FOLLOW(B)=FOLLOW(B)∪{a}={#,a} FOLLOW(D)=FOLLOW(D)∪{b}={b} FOLLOW(T)=FOLLOW(T)∪FOLLOW(B)={d,e,b,#}∪{#,a} ={d,e,b,a,#}

自上而下语法分析

自上而下语法分析
从推导的角度看,从开始符号出发,使用最左 推导,试图推导出与输入符号串相同的句子。
从语法树的角度看,从根节点出发,反复使用 所有可能的产生式,谋求输入串的匹配,试图 向下构造一棵语法树,其末端节点正好与输入 符号串相同。
需要反复试探。
复习
句型的推导
最左(最右)推导:在推导的任何一步α β , 其中α 、β 是句型,都是对α 中的最左(右)非 终结符进行替换 最右推导被称为规范推导。 由规范推导所得的句型称为规范句型。
例1:判定输入串(i+i)*i是否是下述文法的句子?
G = ({E}, {i, +, *, (, ) } , P , E) P: E E + E E E*E E (E) Ei
解:使用最左推导:
E E*E (E)*E (E + E)*E (i + E)*E
(i + i)*E (i + i)*i
高级语言的语法结构适合用上下文无关文法 来描述,上下文无关文法是语法分析的基础。
语法分析在编译系统中所处的位置
语法分析的接口设计
源程序 词法分析器 token串
语法分析器 语法分析树
编译程序 后续部分
• 语法分析器的输入
– Token序列:词法分析的输出,是各个单词都正 确的源程序的变换形式,是一个有限序列
• 语法分析器的输出
– 分析树:表示方法? 见教材 P89 – 错误处理信息:定位、继续编译
语法分析器的功能
按照语言的语法构成规则, 识别输入的符号 串能否构成一个句子。这些规则是用文法的 产生式来定义的。
问题
对给定的一个输入串,如何判定它是不是一 个句子?
方法

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

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

• 例 4.4
4.4 递归下降分析程序构造
• 递归下降分析器:
这个分析程序由一组递归过程组成的,每个过程对应 文法的一个非终结符。 E→TE’ E’→+TE’| T→FT’ T’→*FT’| F→(E)|i
PROCEDURE E BEGIN T ; E’ END PROCEDURE E’ IF SYM=‘+’THEN BEGIN ADVANCE ; T ; E’ END
4.2 自上而下分析面临的问题
• 例4.1 假定有文法
(1) SxAy (2)A**|*
对输入串x*y,构造语法树。 • 构造过程:
(1)把S作为根 (2)用S的产生式构造子树 (3)让输入串指示器IP指向输入串的第一个符号。
S x A y x
S
A y x
S
A y
*
*
*
(4)调整输入串指示器IP与叶结点进行匹配。 (5)如果为非终结符,用A的下一个产生式构建子树。 (6)如果匹配成功则结束;否则,回溯到步骤(4)。
• 一个反例:
– 文法:SQc|c;QRb|b;RSa|a虽然不是直接 左递归,但S、Q、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• • • • 首先构造直接左递归; 再利用一般转换规则,消除直接左递归 化简文法。 下面算法在不含PP,也不含在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1…Pn;按此顺序执行; (2) FOR i:=1 TO n DO
BEGIN FOR j:=1 TO i-1 DO 把形如Pj+1→Pj 的规则改写成 Pj+11|1|…k| 。其中 Pj1|1|…k 是关于 Pj 的 所有规则; 消除关于Pi规则的直接左递归性。 END 化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。

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

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

递归下降分析程序构造 预测分析程序 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 回溯的消除(一)
为了消除回溯就必须保证

语法分析--自上而下分析的基本问题

语法分析--自上而下分析的基本问题

语法分析--⾃上⽽下分析的基本问题语法分析基本概念语法分析的前提:对语⾔的语法结构进⾏描述,采⽤正规式和有限⾃动机描述和识别语⾔的单词符号,⽤上下⽂⽆关⽂法来描述语法规则语法分析的任务:分析⼀个⽂法的句⼦的结构语法分析器的功能:按照⽂法的产⽣式(语⾔的语法规则),识别输⼊符号串是否为⼀个句⼦(合式程序)⾃下⽽上(Bottom-up):从输⼊串开始,逐步进⾏归约,直到⽂法的开始符号,归约:根据⽂法的产⽣式规则,把串中出现的产⽣式的右部替换成左部符号,从树叶节点开始,构造语法树,算符优先分析法、LR分析法⾃上⽽下(Top-down):从⽂法的开始符号出发,反复使⽤各种产⽣式,寻找"匹配"的推导,推导:根据⽂法的产⽣式规则,把串中出现的产⽣式的左部符号替换成右部,从树的根开始,构造语法树,递归下降分析法、预测分析程序⾃上⽽下分析⾯临的问题基本思想:从⽂法的开始符号出发,向下推导,推出句⼦,针对输⼊串,试图⽤⼀切可能的办法,从⽂法开始符号(根结点)出发,⾃上⽽下地为输⼊串建⽴⼀棵语法树多个产⽣式候选带来的问题,回溯问题:分析过程中,当⼀个⾮终结符⽤某⼀个候选匹配成功时,这种匹配可能是暂时的,出错时,不得不“回溯”⽂法左递归问题:⼀个⽂法是含有左递归的,如果存在⾮终结符P⾯临的问题⽂法左递归问题回溯问题构造不带回溯的⾃上⽽下分析算法消除⽂法的左递归性消除回溯消除⽂法的左递归直接左递归的消除间接左递归的消除消除左递归的算法由于对⾮终结符排序的不同,最后所得的⽂法在形式上可能不⼀样。

但不难证明,它们都是等价的消除回溯为了消除回溯必须保证:对⽂法的任何⾮终结符,当要它去匹配输⼊串时,能够根据它所⾯临的输⼊符号准确地指派它的⼀个候选去执⾏任务,并且此候选的⼯作结果应是确信⽆疑的FIRST和FOLLOW集合的构造FIRST集合令G是⼀个不含左递归的⽂法,对G的所有⾮终结符的每个候选α定义它的终结⾸符集FIRST(α)为:提取公共左因⼦FOLLOW集合L: 从左到右扫描输⼊串 L: 最左推导 1:每⼀步只需向前查看⼀个符号FIRST和FOLLOW集合的构造构造每个⽂法符号的FIRST集合构造FOLLOW(A)构造每个⾮终结符的FOLLOW集合对最后的FIRST、FOLLOW集合有点迷,真的有点迷,晚上不该看这个的!!o(╥﹏╥)o。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 其中规则1、2、3根据前面的规则②构造,4 根据规则① 构造。
使用例5.2分析句子
给定输入串00c11,所构造的PDA用下面的 移动序列来接收它(注意,我们可从构形 中省掉状态,因为它总是相同的): (q,00c11,S)├4a(q,00c11,0S1)├1(q,0c1 1,S1) ├4a(q,0c11,0S11)├1(q,c11,S11) ├4b(q,c11,c11)├3(q,11,11) ├2(q,1,1)├2(q,ε,ε) (接收)
M=(Q,∑′,H,δ,q0, Z0,F) 它只有一个状态q和下面的转换规则: • ① 对P中每一个形如A→w的产生式,δ(q,ε,A)包含(q,w); • ② 对每个a∈∑,δ(p,a,a)包含(q,ε) 且
– Q={q}
– ∑′=∑ – H=N∪∑
– q0=q – Z0=S – F为终态集(可空)。 这个PDA停止于空栈。
号;
• H 是有穷的下推栈字符表,它的每个元素称为一 个栈符号。
• q0∈Q 是该PDA的初态; • Z0∈H 是下推栈的初始符号; • F Q 是一个终态集(或接收状态集);它的每个
元素称为终态;(可空)。
5.1.1 PDA形式定义
• δ 是描述PDA动作与状态变化的。 PDA的动作可用δ定义式来表示为:
方括号用来表示可选项。[x] = x或,表示符号串x可出现一 次或不出现。可以用来定义某些高级语言中的“条件语句”。
• ③ 圆括号( )
利用圆括号可提出一个非终结符的多个产生式右部的公共因 子。例如,
A→xy|xw|…|xz 可写成 A→x(y|w|…|z)
利用下面的两条规则,可把包含直接左递归的产生式 转换成用扩展BNF表示法表示的产生式。 • ① 提公因子 每当一条产生式中有公因子可提的时候,就把它提出 来,若原产生式是 A→x|xy 则可写成 A→x(y|ε),这里把ε当作最后一个候选式。 • ② 若 A→x|y|…|z|Av 是一组产生式,且它只有一个直接左递归的右部位于 最后,则可把这组产生式变换成如下形式:
δ(q,a,z)={(p1,h1),(p2,h2)…(pn,hn)} 它的含义为: • 在控制器当前状态为q,下推栈顶符号为z ,输
入符号为a的情况下,把控制器的状态改为 pi,用hi 替换栈顶的z,并让读头右移一格。
5.1.2 PDA的 构形和移动
PDA的一个构形是一个三元组:(q,w,h)
• 其中,q∈Q;w∈∑*是尚待扫描的输入串,包括读 头当前所指的符号;h∈H*是栈的内容。
5.1.2 PDA的 构形和移动
• PDA M 所识别的语言L(M)可表示为: L(M)= {ω*︱(P0,ω,Z0)├*(P,,)}(空栈接收)
或者 L(M)= {ω*︱(P0,ω,Z0)├*(P,,h) &pF}
(终态接收)
例5.1 考虑下表定义的两状态PDA,其的两个状态分别是p和 Q,δ(p,a,Z)={(p1,h1),(p2,h2),…},输入符号是0和1,栈符 号是R,B和G。该PDA识别由符号0和1组成的所有回文 (Palindrome) 。
• 回溯现象:在回溯之前,编译程序实 际已经做了大量薄记工作,包括语义 翻译工作在内。在回溯时,要清除这 些内容,然后开始重新薄记,这就降 低了分析效率。
• 左递归现象:回溯使语法分析器的动 作不稳定,左递归会使分析程序进入 到无穷的循环之中,这些问题都和描 述语言的文法有直接关系。
5.2.2 用扩展的BNF表示法消除左递归
• PDA的一次移动可看作是从一种构形变换成另一种 构形的一种方式。反过来,构形又为定义PDA的移 动提供了一种更简单的手段。我们称
(q,ax,Zh′)├(p,x,hh′)
是一次可能的移动,当且仅当(p,h)∈δ(q,a,Z) 。 • 常用├+表示由一次或多次移动组成的序列。用├*表
示由零次或多次移动组成的序列。注意“零”次移 动并不改变当前的构形。
例5.2 考虑文法
S→0S1|c 该文法描述语言0*c1*,其中0的个数和1的个 数相等。转换规则是:
• 1.δ(q,0,0)=(q,ε) • 2.δ(q,1,1)=(q,ε) • 3.δ(q,c,c)=(q,ε) • 4.δ(q,ε,S)={(q,0S1) ,(q,c)}(其中ε可
与任何合法输入符号匹配)
由行1
• (p,00,GGBBR) ├
或 ├(Q,001100,ε) 由行7(阻
(p,0,BGGBBR) 由行4
塞)
• (p,0,BGGBBR) ├
• (p,01100,BR) ├
(p,ε,BBGGBBR) 由行3a(阻塞)
(p,1100,BBR) 由行3a
或 ├(Q,ε,GGBBR) 由行
或 ├(Q,1100,R) 由行3b
A→Ay 称之为直接左递归产生式。
5.2.1 文法的左递归性
• 若其中y=ε,则有 A→xA
称之为直接右递归产生式。 • 若一文法中至少含有一条递归产生式,
或在用该文法推导符号串的过程中, 存在AA…或A…A或A…A…形式 的推导,则称该文法是(直接)递归的。
非确定的自顶向下分析存在的问题
• .非确定的自上而下的分析法:对任何输入 串W试图用一切可能的办法,从文法的开始 符号出发,自上而下地为它建立一棵语法 树。或者说,为输入串寻找一个最左推导, 如果试探成功,则W为相应文法的句子,否 则W就不是文法的句子。这种分析过程本质 上是一种穷举试探过程,反复使用不同的 规则,谋求匹配输入串的过程。
• 本章中,我们通过讨论一个一般的非确定的自 上而下分析器来讨论上下无关语言的自上而 下分析器的设计。
5.1 非确定的下推自动机
• 下面所要构造的非确定的自上而下分析器 属于一般的下推自动机(PDA)类。
• 所谓一个下推或栈自动机(Stack Automaton),非形式地说,应包含:
–①一个输入符号串;
• (Q,ε,R) ├(Q,ε,ε) 由行 10(接收)
5.1.3 上下文无关语言与PDA
联系PDA和上下文无关语言的一个重要 定理是: • 定理5.1 对每一个上下文无关语言L, 存在一个恰好识别L的非确定的PDA M, 反之亦然。 • 这个定理在编译系统中的实际重要性 在于:现有的大多数高级程序设计语 言都可用上下文无关文法描述。因此 定理5.1隐含了:识别这个语言的机械 识别器必是PDA。
A→(x|y|…|z){v} • 也就是说,使用上述规则①,可把产生式改写成相对
于某个非终结符而言,至多只含一个直接左递归的右 部;然后,利用上述规则②消除这个直接左递归。
5.2.3 直接改写文法
• 设产生式 U→ Uxy
此产生式称为直接左递归形式。其中,x和y 是两个符号串,y的首字符不是U。 • 产生式为直接左递归形式,可直接改写为一 个等价的非直接左递归形式
如果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=ε,则有
输入串,栈和句型
由算法5.1构造的非确定的PDA的一个有趣
特性是由下面的定理表示出来的。
• 定理5.2 令(q,y,h)是某个文法G相关的 NDPDA的任意构形,其中输入串是xy,如果
(q,xy,S)├*(q,y,h)
• 那么xh是G的一个最左句型,换言之,S=* >xh(S是G的开始符号)。
• 上述定理反过来也成立:给定G中的任何句型xh,
U→ y1U y2U…ynU U → x1U x2U…xmU
• 消除左递归举例。
例如 :有文法:
S→Sa 可改写为:S→bSˊ
S→b
Sˊ→aSˊ|ε
表达式文法: 消除左递归后:
E→E+T|T
E→TEˊ Eˊ→+TEˊ|ε
T→T*F|F
T→FTˊ Tˊ→*FTˊ|ε
F→(E)|i
F→(E)|i
• 消除间接左递归
U→ yU U → xU • 其中U是新引进的非终结符号。显然,这种 形式与原形式是等价的,即从A推出的符号串 是相同的。
• 直接左递归更一般的形式 U→ Ux1Ux2…Uxmy1y2…yn
其中,xi (i=1, 2, …, m) yi (i=1, 2, …, n), yj的头字符都不是U, xi 都不 是,则有
5.1.3 上下文无关语言与PDA
• 定理5.1包含两方面含义: –给定一个上下文无关语言,存 在一个识别它的PDA M; –反过来,给定一个PDA M,可以 根据它构造出一个等价的上下文 无关文法。 前者对编译程序的构造很有吸引 力,但后者则不然。
算法5.1 从CFG到NDPDA
• 给定 CFG G=(N,∑,P,S) 可以构造 一个相应的非确定的PDA M:
1.重新改写文法
2.先将间接左递归变为直接左递归,然后再按上述方法消 除。
例(1)A→aB 用(1)(2)去替换(3)中的A可得:
(2)A→Bb
(1)B→aBc
(3)B→Ac
(2)B→Bbc
(4)B→d
(3)B→d
消除左递归后可得:
B→(d|aBc)Bˊ
Bˊ→bcBˊ|ε
最终文法为:
(1)A→aB
(2)A→Bb
第五章 自上而下语法分析
• 语法分析是继词法分析之后编译过程的第2阶 段。它的主要任务是对词法分析的输出结 果——单词序列进行分析,识别合法的语法 单位。
• 语法分析最常用的方法有:优先方法、递归 下降法、LL方法和LR方法。
相关文档
最新文档