第五章自上而下的语法分析
- 格式:ppt
- 大小:1.08 MB
- 文档页数:50
编译原理武汉大学计算机学院编译原理课程组第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表示•引进新的非终结符号,将左递归改写为右递归。
第五章⾃上⽽下语法分析第五章⾃上⽽下语法分析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分析⼀、带回溯的⾃顶向下分析⽅法是⾃顶向下分析的⼀般⽅法,即对任⼀输⼊符号串,试图⽤⼀切可能的办法,从树根结点(识别符号)出发,根据⽂法⾃上⽽下地为输⼊串建⽴⼀棵语法树,或者说,从识别符号开始,根据⽂法为输⼊串建⽴⼀个推导序列,这种分析过程本质上是⼀种试探过程,是反复使⽤不同规则谋求匹配输⼊串的过程。
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语法分析器生成工具构成。
由机器自动生成的代码相比较于程序员手工的代码,拥有更好的运行效率而且减少了程序员的工作量。
第五章自顶而下语法分析方法(一)内容本章介绍编译程序的第二个阶段语法分析的第一种设计方法和实现原理即自上而下分析的原理及无回朔的递归下降分析、 LL(1)分析法和相应程序构造。
(二)本章重点自上而下分析的思想,LL(1)文法,LL(1)预测分析,递归下降分析程序的构造。
(三)本章难点消除左递归,预测分析表的构造,求First集和Follow集,预测分析中的出错处理。
(四)本章考点LL(1)文法的判定。
递归下降分析程序的构造。
预测分析程序的构造与分析方法。
(五)学习指导理解自上而下分析面临的问题,理解递归下降分析、LL(1)文法,掌握无回朔的递归下降分析方法的设计和程序实现、LL(1)分析表的构造与分析方法。
语法分析是在词法分析的基础上判定程序的语法结构是否符合语法规则的过程。
词法分析器的构造技术是编译器的主要技术。
词法分析分为自上而下的分析(LL(K))和自下而上的分析(算符优先、LR(K))。
本章先学习在逻辑概念上易于接受的自上而下的分析,即从文法开始符号出发,自上而下地为输入串建立一棵语法树,或者说为输入串寻找一个最左推导。
LL(1)分析法是本章的学习重点。
附训练试题:1试构造与下列文法G[S]等价的无左递归文法。
G[S]: S→Sa|Nb|c (1)N →Sd|Ne|f2:文法G的规则集为;P →begin d : X endX →d : X | sYY→: sY | e做出该文法LL(1)分析表。
3 设有以下文法:G[S]: S→eEfGh | gE→FSG | hF→SEc | cG | εG→Sh |ε(1)求出该文法每一个非终结符的FOLLOW集。
(2)它是LL(1)文法吗?为什么?4:给出语言L={1n a0n1m a0m|n>0, m>=0} 的LL(1)文法G[S]并说明其理由。
5 设有文法:G[S]:S→aBc | bABA→aAb | bB→b | e构造其LL(1)分析表,并分析符号串baabbb是否是该文发的句子。
语法分析--⾃上⽽下分析的基本问题语法分析基本概念语法分析的前提:对语⾔的语法结构进⾏描述,采⽤正规式和有限⾃动机描述和识别语⾔的单词符号,⽤上下⽂⽆关⽂法来描述语法规则语法分析的任务:分析⼀个⽂法的句⼦的结构语法分析器的功能:按照⽂法的产⽣式(语⾔的语法规则),识别输⼊符号串是否为⼀个句⼦(合式程序)⾃下⽽上(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]自下而上分析的大体问题[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所示。