第5章 语法分析(2)自下而上分析 (编译原理 陈火旺)
- 格式:ppt
- 大小:1011.00 KB
- 文档页数:72
编译原理之语法分析-⾃下⽽上分析(⼆)、 (⼀)LR分析法 LR分析定义:从左到右扫描(L)输⼊串,构造最右推导的逆过程(R),是⾃下⽽上分析法的核⼼。
LR分析法特点:严格的规范规约。
⽐递归下降分析法、LL(1)分析法对⽂法的限制要少得多,适⽤范围⼴,适⽤于⼤多数上下⽂⽆关⽂法描述的语⾔。
分析速度快,能准确定位错误。
LR分析法缺点:⼿⼯构造分析程序⼯作量相当⼤。
LR分析器的组成:总控程序:执⾏分析表所规定的动作,对进⾏操作。
所有的LR分析器相同。
分析栈:⼜分为符号栈和状态栈。
符号栈:存放分析过程中移进或归约的符号。
状态栈:状态栈存放的是状态(标记号),记录分析过程中从开始的某⼀归约阶段的整个分析历史或预测扫描了能遇到的分析符号分析表:LR分析器的核⼼。
其功能指⽰分析器是移进还是规约,根据不同的⽂法类要采⽤不同的构造⽅法。
(后边会具体描述) LR分析器模型: 根据上图可以看出LR分析程序依次将输⼊串以及当前状态移⼊分析栈,然后根据分析栈和当前输⼊串去查找分析表去判断下⼀步应该进⾏什么操作。
我们最终的⽬的是通过⼀系列操作去构造这个LR分析表。
四种LR分析⽅法以及范围:在后续博客中我们会依次讲解LR(0)、SLR(1)、LR(1)。
图中看出⼀个LR(0)⽂法必定是SLR(1)、LALR(1)和LR(1)⽂法;LALR(1)⽂法必定是LR(1)⽂法。
(⼆)LR(0)分析法基本概念 LR(0)定义:从左到右扫描(L)输⼊串,构造最右推导的逆过程(R),0代表不向前看任意符号即不进⾏展望或预测。
LR(0)分析法流程(移进-归约):识别活前缀(⽬的是为了寻找句柄)NFA->DFA->项⽬集规范族(DFA的元素)CLOSURE(求规范族)->GO(DFA边)构造LR(0)分析表 同样先讲解⼏个定义:活前缀、增⼴⽂法(拓⼴⽂法)、LR(0)项⽬。
活前缀(可归前缀):⽬的是为了寻找LR分析中可归约串(句柄),采取归约过程前符号栈中的内容,称为可归前缀。
编译原理武汉大学计算机学院编译原理课程组第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表示•引进新的非终结符号,将左递归改写为右递归。
第5章自顶向下语法分析方法第1题对文法G[S]S→a||(T)∧T→T,S|S(1) 给出(a,(a,a))和(((a,a),,(a)),a)∧的最左推导。
(2) 对文法G,进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3) 经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4) 给出输入串(a,a)#的分析过程,并说明该串是否为G的句子。
答案:也可由预测分析表中无多重入口判定文法是LL(1)的。
可见输入串(a,a)#是文法的句子。
第3题已知文法G[S]:S→MH|aH→LSo|εK→dML|εL→eHfM→K|bLM判断G是否是LL(1)文法,如果是,构造LL(1)分析表。
第7题对于一个文法若消除了左递归,提取了左公共因子后是否一定为LL(1)文法?试对下面文法进行改写,并对改写后的文法进行判断。
(1)A→baB|εB→Abb|a(2) A→aABe|aB→Bb|d(3) S→Aa|bA→SBB→ab答案:(1)先改写文法为:0) A→baB1) A→ε2) B→baBbb3) B→bb4) B→a再改写文法为:0) A→baB1) A→ε2) B→bN3) B→a4) N→aBbb5) N→b(2)文法:A→aABe|a B→Bb|d提取左公共因子和消除左递归后文法变为:0) A→a N1) N→A B e2) N→ε3) B→d N14) N1→b N15) N1→ε(3)文法:S→Aa|b A→SB B→ab第1种改写:用A的产生式右部代替S的产生式右部的A得:S→SBa|b B→ab消除左递归后文法变为:0) S→b N1) N→B a N2) N→ε3) B→a b也可由预测分析表中无多重入口判定文法是LL(1)的。
第2种改写:用S的产生式右部代替A的产生式右部的S得:S→Aa|b A→AaB|bB B→ab消除左递归后文法变为:0) S→A a1) S→b2) A→b B N3) N→a B N4) N→ε5) B→a b预测分析表:。
第五章语法分析—自下而上分析本章要点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分析法属于自底向上分析。
第五章语法分析——自下而上分析要紧内容:[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所示。