编译原理重点4.ppt
《编译原理重点4.ppt》由会员分享,可在线阅读,更多相关《编译原理重点4.ppt(113页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 AnIntroductiontoDatabaseSystem中南民族大学计算机科学学院中南民族大学计算机科学学院编译原理编译原理Compilers Principles第七章第七章 自下而上的自下而上的LR(K)LR(K)分析分析方法方法Bottom-up parsingBottom-up parsingAnIntroductiontoDatabaseSystem概述概述一一.自底向上的分析方法是一种移进自底向上的分析方法是一种移进-规约过程,规约过程,关键问题是:如何确定句柄。关键问题是:如何确定句柄。二二.LR(k).LR(k)方法于方法于19651965年由年由KnuthKnuth提出
2、。提出。三三.LR(k).LR(k)分析器:从分析器:从左左到右扫描输入串,进行到右扫描输入串,进行规规范归约范归约。分析过程中,至多向前查看。分析过程中,至多向前查看k k个输入个输入符号,即可决定当前的动作是归约还是移进。符号,即可决定当前的动作是归约还是移进。若为归约,能选择唯一一个产生式进行归约。若为归约,能选择唯一一个产生式进行归约。编译原理CompilersPrinciples第7章3概述概述(续续1)1)四四.LR(k).LR(k)分析器功能较强,主要优缺点为:分析器功能较强,主要优缺点为:1.1.优点优点:(1)(1)对文法的限制比较少对文法的限制比较少(与自顶向下的与自顶向下
3、的LL(K)LL(K)、自底向上的优先分析方法相比而言)。自底向上的优先分析方法相比而言)。(2)(2)分析速度快,能准确、即时地指出出错位分析速度快,能准确、即时地指出出错位置。置。2.2.缺点:对于一个实用语言文法的分析器来说,构缺点:对于一个实用语言文法的分析器来说,构造工作量很大。造工作量很大。编译原理CompilersPrinciples第7章4概述概述(续续2)2)五五.LR(k).LR(k)分析器由一个总控程序和一个分分析器由一个总控程序和一个分析表以及析表以及2 2个分析栈构成。个分析栈构成。六六.4.4种分析表的构造方法:种分析表的构造方法:LR(0),SLR(1),LR(1
4、),LALR(1)LR(0),SLR(1),LR(1),LALR(1)编译原理CompilersPrinciples第7章57.1 LR7.1 LR分析方法概述分析方法概述LR(k)LR(k)分析器由一个总控程序和一个分析表以及分析器由一个总控程序和一个分析表以及2 2个分析栈个分析栈构成。构成。LRLR分析器的总控程序相同。分析器的总控程序相同。不同文法,分析表不同;同一文法,采用不同不同文法,分析表不同;同一文法,采用不同LRLR分析分析法,分析表也不同。法,分析表也不同。分析表可分为动作表分析表可分为动作表(ACTION)(ACTION)和状态转换表和状态转换表(GOTO)(GOTO)。
5、分析栈包括文法符号栈和相应的状态栈。分析栈包括文法符号栈和相应的状态栈。LR(k)LR(k)分析器的工作过程为:分析器的工作过程为:编译原理CompilersPrinciples第7章6LRLR分析器工作过程示意图分析器工作过程示意图Sn Xn.S1 X1S0 X0LR驱动程序动作表 转移表action goto输出输入串XXX$编译原理CompilersPrinciples第7章7LRLR分析器工作过程示意图的说明分析器工作过程示意图的说明 移进 ai 和s=gotosm,ai进栈actionsm,ai=归约 rj:AXm-r+1Xm-r+2Xms=gotosm-r,A 接受 出错gotoS
6、i,X=SjX为文法符号 编译原理CompilersPrinciples第7章8回顾:移进回顾:移进-规约分析规约分析 例例1 1文法文法GS:(1)S aAcBe(2)A b(3)A Ab(4)B d步骤步骤符号栈符号栈输入符号串输入符号串动作动作 1)#abbcde#移进移进 2)#a bbcde#移进移进 4)#aA bcde#移进移进 6)#aA cde#移进移进 7)#aAc de#移进移进 9)#aAcB e#移进移进11)#S#接受接受对输入串对输入串abbcdeabbcde#的移进的移进-规约分析过程规约分析过程 5)#aAb cde#归约归约(AAb)3)#ab bcde#归
7、约归约(Ab)8)#aAcd e#归约归约(Bd)10)#aAcBe#归约归约(SaAcBe)编译原理CompilersPrinciples第7章9移进移进-归约中的问题归约中的问题在步骤在步骤3中,用中,用Ab归约归约在步骤在步骤5中,用中,用AAb归约归约问题:何时移进?何时归约?用哪个产生式归约问题:何时移进?何时归约?用哪个产生式归约?在优先分析方法中如何解决这个问题的?在优先分析方法中如何解决这个问题的?编译原理CompilersPrinciples第7章10移进移进-归约中的问题分析归约中的问题分析分析:已分析过的部分在栈中的前缀不同,而且移分析:已分析过的部分在栈中的前缀不同,而
8、且移进和归约后栈中的状态会发生变化进和归约后栈中的状态会发生变化我们引入一个新的状态栈来表示符号栈中的符号目我们引入一个新的状态栈来表示符号栈中的符号目前状态,用前状态,用LR分析表来表示不同状态下对于各输入符分析表来表示不同状态下对于各输入符号应采取的动作号应采取的动作 3)#ab bcde#归约归约(Ab)5)#aAb cde#归约归约(AAb)4)#aA bcde#移进移进 6)#aA cde#移进移进编译原理CompilersPrinciples第7章117.2 LR(0)7.2 LR(0)分析分析例例1 文法文法GS:(1)S aAcBe(2)A b(3)A Ab(4)B dS Si
9、 i:移进,并将状态移进,并将状态i i进进栈栈r ri i:用第用第i i个产生式归约,个产生式归约,同时状态栈与符号同时状态栈与符号栈退出相应个符号,栈退出相应个符号,根据根据GOTOGOTO表将相应表将相应状态入栈状态入栈文法文法GS的的LR(0)分析表分析表(注:该表没有填写完注:该表没有填写完)编译原理CompilersPrinciples第7章12对输入串对输入串abbcdeabbcde#的的LR(0)LR(0)分析过程分析过程输入串输入串abbcdeabbcde#的的分析过程分析过程步骤步骤 符号栈符号栈输入符号串输入符号串 动作动作 1)#abbcde#移进移进 0 S2 2)
10、#a bbcde#移进移进 02 S4 3)#ab bcde#归约归约(Ab)024 r2 3 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235 S8 9)#aAcB e#移进移进 02357 S911)#S#接受接受 01 acc 5)#aAb cde#归约归约(AAb)0236 r3 3 8)#aAcd e#归约归约(Bd)02358 r4 710)#aAcBe#归约归约(SaAcBe)023579 r1 1状态栈状态栈ACTIONGOTO编译原理CompilersPrinciples第7章13LR(0)LR(
11、0)分析分析的的问题问题n对于一个文法,会有一些什么样对于一个文法,会有一些什么样的状态呢?这些状态又是如何确的状态呢?这些状态又是如何确定的?定的?nLRLR分析表是如何得到的?分析表是如何得到的?编译原理CompilersPrinciples第7章14可归前缀与活前缀可归前缀与活前缀文法文法GS:(1)S aAcBe1(2)A b2(3)A Ab3(4)B d4每次归约句型的每次归约句型的前部分前部分依次为:依次为:ab2aAb3aAcd4aAcBe1规范句型的这种前部分符号串称为规范句型的这种前部分符号串称为可归前缀可归前缀我们把形成可归前缀之前包括可归前缀在内我们把形成可归前缀之前包括
12、可归前缀在内的所有规范句型的前缀都称为的所有规范句型的前缀都称为活前缀活前缀 ,a,ab ,a,aA,aAb ,a,aA,aAc,aAcd ,a,aA,aAc,aAcB,aAcBeS aAcBe1 aAcd4e1 aAb3cd4e1 ab2b3cd4e1编译原理CompilersPrinciples第7章15活前缀(活前缀(Viable Prefixes)的)的定义定义n活前缀:活前缀:S=*A =是文法是文法G中的一个规中的一个规范推导,如果符号串范推导,如果符号串是是的前缀,则称的前缀,则称是是G的一的一个个活前缀活前缀。其中,其中,S是对原文法拓广后的开始符号,即有:是对原文法拓广后的开
13、始符号,即有:S-S编译原理CompilersPrinciples第7章16识别活前缀的有限自动机识别活前缀的有限自动机LR方法中,并不是直接分析文法符号栈中的符号是否形成方法中,并不是直接分析文法符号栈中的符号是否形成句柄,但是,我们可以把文法的终结符和非终结符都句柄,但是,我们可以把文法的终结符和非终结符都看成有穷自动机的输入符号,每次把一个符号进栈看看成有穷自动机的输入符号,每次把一个符号进栈看成已识别过了该符号,同时状态进行转换,当识别到成已识别过了该符号,同时状态进行转换,当识别到可归前缀时,相当于在栈中形成句柄,认为达到了识可归前缀时,相当于在栈中形成句柄,认为达到了识别句柄的终态
14、。别句柄的终态。即用自动机中的状态来刻画分析过程中的某一种情形。即用自动机中的状态来刻画分析过程中的某一种情形。编译原理CompilersPrinciples第7章17如何构造识别活前缀的有限自动机如何构造识别活前缀的有限自动机n已经有了活前缀如何构造有限自动机?n活前缀及其可归前缀的一般计算方法编译原理CompilersPrinciples第7章18构造识别文法活前缀的构造识别文法活前缀的DFADFA的三种方法的三种方法一、根据形式定义求出活前缀的正规表达式,然一、根据形式定义求出活前缀的正规表达式,然后由此正规表达式构造后由此正规表达式构造NFANFA再确定化为再确定化为DFA(DFA(不
15、不实用,略实用,略)二、求出文法的所有项目,按一定规则构造识别二、求出文法的所有项目,按一定规则构造识别活前缀的活前缀的NFANFA再确定化为再确定化为DFA(DFA(了解了解)三、使用闭包函数(三、使用闭包函数(CLOSURECLOSURE)和转向函数和转向函数(GOTO(I,X)(GOTO(I,X)构造文法构造文法GG的的LR(0)LR(0)的项目集规的项目集规范族,再由转换函数建立状态之间的连接关系范族,再由转换函数建立状态之间的连接关系得到识别活前缀的得到识别活前缀的DFA(DFA(掌握掌握)编译原理CompilersPrinciples第7章19构造识别活前缀的有限自动机构造识别活前
16、缀的有限自动机 例子例子文法文法GS:S S0S aAcBe1A b2A Ab3B d4句子句子abbcdeabbcde的可归前缀如下:的可归前缀如下:S0S0ab1ab1aAb3aAb3aAcd4aAcd4aAcBe1aAcBe1构造识别其活前缀及可归前缀的有限自动机如下:构造识别其活前缀及可归前缀的有限自动机如下:104387131210182591461715161110SabaAbaAcdaAcBe*1*句子识别态句子识别态i句柄识别态句柄识别态SceBAadbAb编译原理CompilersPrinciples第7章20识别活前缀的有限自动机识别活前缀的有限自动机 例子例子104387
17、131210182591461715161110SabaAbaAcdaAcBe*X加上开始状态加上开始状态X确定化:确定化:X13246859SabAbcBed7*编译原理CompilersPrinciples第7章21例例1 1中中abbcdeabbcde#分析过程所对应的自动机分析过程所对应的自动机 步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235 S8 9)#aAcB e#
18、移进移进 02357 S911)#S#接受接受 01 acc 3)#ab bcde#归约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3 8)#aAcd e#归约归约(Bd)02358 r4 710)#aAcBe#归约归约(SaAcBe)023579 r1 1状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章22步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2对输入串abbcde#的LR分析过程状态栈状态栈ACTIONGOTO014235
19、769SabAbcBed8*编译原理CompilersPrinciples第7章23步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 对输入串abbcde#的LR分析过程状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章24步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 对输入串abbcde#的LR分析过程 3)#ab bcde#归约归约(Ab)
20、024 r2 3状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章25步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6对输入串abbcde#的LR分析过程 3)#ab bcde#归约归约(Ab)024 r2 3状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章26步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作
21、1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6对输入串abbcde#的LR分析过程 3)#ab bcde#归约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章27步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#a
22、A cde#移进移进 023 S5对输入串abbcde#的LR分析过程 3)#ab bcde#归约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3状态栈状态栈ACTIONGOTO*014235769SabAbcBed8编译原理CompilersPrinciples第7章28步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235 S8对输入串abb
23、cde#的LR分析过程 3)#ab bcde#归约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3状态栈状态栈ACTIONGOTO*014235769SabAbcBed8编译原理CompilersPrinciples第7章29步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235 S8对输入串abbcde#的LR分析过程 3)#ab bcde#归
24、约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3 8)#aAcd e#归约归约(Bd)02358 r4 7状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章30步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235 S8 9)#aAcB e#移进移进 02357 S9对输
25、入串abbcde#的LR分析过程 3)#ab bcde#归约归约(Ab)024 r2 3 5)#aAb cde#归约归约(AAb)0236 r3 3 8)#aAcd e#归约归约(Bd)02358 r4 7状态栈状态栈ACTIONGOTO014235769SabAbcBed8*编译原理CompilersPrinciples第7章31步骤步骤 符号栈符号栈 输入符号串输入符号串动作动作 1)#abbcde#移进移进 0 S2 2)#a bbcde#移进移进 02 S4 4)#aA bcde#移进移进 023 S6 6)#aA cde#移进移进 023 S5 7)#aAc de#移进移进 0235
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 重点
限制150内