new第四章语法分析.ppt
《new第四章语法分析.ppt》由会员分享,可在线阅读,更多相关《new第四章语法分析.ppt(156页珍藏版)》请在三一办公上搜索。
1、编 译 原 理Compiler Principles,蒋凌云南京邮电大学.计算机学院,第四章 语法分析,教材:编译技术原理及其实现方法王汝传 编著,第四章 语法分析,本章内容,4.1 引言 一、语法分析任务 二、语法分析方法4.2 自顶向下语法分析 一、自顶向下分析方法的问题及其解决办法 二、递归子程序分析法(递归下降分析法)三、LL(1)分析法4.3 自底向上语法分析 一、简单优先文法分析法 二、算符优先分析法 三、优先函数及其构造 四、LR分析法 五、二义性文法的应用4.4 语法分析程序的自动生成 一、分析器的生成器YACC 二、用YACC处理二义性文法,一、简单优先文法分析法 三、优先函
2、数及其构造 1.与文法有关的一些关系定义 1.优先函数定义 2.构造文法关系传递闭包 2.优先函数矩阵的构造 和自反传递闭包 3.利用优先函数矩阵进行语法分析 3.文法优先关系概念 四、LR分析法 4.文法优先关系的构造 1.LR分析法一般概述 5.简单优先文法 2.LR分析器工作原理 6.简单优先文法分析算法 3.LR(0)分析表构造二、算符优先分析法 4.SLR(1)分析表构造 1.算符优先关系概念 5.LR(1)分析表构造 2.算符优先文法 6.LALR分析表构造 3.算符优先关系的构造方法 五、二义性文法的应用 4.最左素短语 1.问题的提出 5.算符优先分析算法 2.二义性文法分析表
3、的构造,第四章 语法分析,4.3 自底向上语法分析,一、简单优先文法分析法 三、优先函数及其构造 1.与文法有关的一些关系定义 1.优先函数定义 2.构造文法关系传递闭包 2.优先函数矩阵的构造 和自反传递闭包 3.利用优先函数矩阵进行语法分析 3.文法优先关系概念 四、LR分析法 4.文法优先关系的构造 1.LR分析法一般概述 5.简单优先文法 2.LR分析器工作原理 6.简单优先文法分析算法 3.LR(0)分析表构造二、算符优先分析法 4.SLR(1)分析表构造 1.算符优先关系概念 5.LR(1)分析表构造 2.算符优先文法 6.LALR分析表构造 3.算符优先关系的构造方法 五、二义性
4、文法的应用 4.最左素短语 1.问题的提出 5.算符优先分析算法 2.二义性文法分析表的构造,第四章 语法分析,4.3 自底向上语法分析,一、简单优先文法分析法 三、优先函数及其构造 1.与文法有关的一些关系定义 1.优先函数定义 2.构造文法关系传递闭包 2.优先函数矩阵的构造 和自反传递闭包 3.利用优先函数矩阵进行语法分析 3.文法优先关系概念 四、LR分析法 4.文法优先关系的构造 1.LR分析法一般概述 5.简单优先文法 2.LR分析器工作原理 6.简单优先文法分析算法 3.LR(0)分析表构造二、算符优先分析法 4.SLR(1)分析表构造 1.算符优先关系概念 5.LR(1)分析表
5、构造 2.算符优先文法 6.LALR分析表构造 3.算符优先关系的构造方法 五、二义性文法的应用 4.最左素短语 1.问题的提出 5.算符优先分析算法 2.二义性文法分析表的构造,第四章 语法分析,4.3 自底向上语法分析,4.3 自底向上语法分析,前面我们介绍的几种语法分析方法对相应的文法都有一定的要求。例如:因此,上述这些方法在使用上有一定局限性。LR分析法是1965年由Knuth提出一种自底向上语法分析方法,可用于一大类上下文无关文法分析,这种技术叫做LR(K)分析技术。,不带回溯的自顶向下分析方法要求文法不存在左递归,并且每一规则的各候选式的终结首符集两两不相交;算符优先分析方法则要求
6、文法的各终结符号对间至多只有一种优先关系,等等。,1.LR分析法一般概述,4.3 自底向上语法分析,(1)LR(K)分析法定义,LR(K)分析法意思是:L是指从左(Left)到右扫描输入符号串,R是构造最右(Rightmost)推导过程自底向上的分析方法。K是指在决定分析动作时向前看符号的个数。若K0,就为LR(0)分析,说明分析动作时,不向前看任何符号,LR(1)分析,说明分析动作时只向前看一个符号。这是一类对上下文无关文法进行“自左到右扫描和最左归约”的自底向上的分析方法,在这种分析过程中,它至多只向前查看个输入符号就能确定当前的动作是移进还是归约;若动作归约,它还能唯一地选中一个规则去归
7、约当前已识别的句柄。,4.3 自底向上语法分析,(2)LR分析法的特点,1)LR分析器(程序)基本上可以识别所有上下文无关文法写的编程语言结构,分析能力强且适用范围广 2)LR分析法是当前最一般的“移进-归约”分析方法 3)LR分析法在自左向右扫描输入串时能发现其中错误,并能指出出错地点。4)LR分析程序可以自动生成,4.3 自底向上语法分析,(3)LR分析器的组成,从逻辑上说,一个LR分析器包括两部分:一个总控程序和一张分析表。一般说来,所有LR分析器总控程序是一样的,只是分析表各不相同。,4.3 自底向上语法分析,(4)LR分析表种类,1)最简单分析表LR(0):局限性大,但它是建立其它分
8、析表的基础 2)简单分析表SLR:比较容易实现,SLR分析表的功能比LR(0)稍强些 3)LR(K)分析表:分析能力最强,但实现代价高。主要讨论LR(1)4)LALR分析表:称为向前看LR分析表,功能介于SLR(1)和LR(1)之间,适用于大多数程序设计语言的结构,并且可以比较有效地实现。,一、简单优先文法分析法 三、优先函数及其构造 1.与文法有关的一些关系定义 1.优先函数定义 2.构造文法关系传递闭包 2.优先函数矩阵的构造 和自反传递闭包 3.利用优先函数矩阵进行语法分析 3.文法优先关系概念 四、LR分析法 4.文法优先关系的构造 1.LR分析法一般概述 5.简单优先文法 2.LR分
9、析器工作原理 6.简单优先文法分析算法 3.LR(0)分析表构造二、算符优先分析法 4.SLR(1)分析表构造 1.算符优先关系概念 5.LR(1)分析表构造 2.算符优先文法 6.LALR分析表构造 3.算符优先关系的构造方法 五、二义性文法的应用 4.最左素短语 1.问题的提出 5.算符优先分析算法 2.二义性文法分析表的构造,第四章 语法分析,4.3 自底向上语法分析,4.3 自底向上语法分析,Sm.S1S0,总控程序,分析表,Sm.S2S1S0,Xm.X2X1#,(1)LR分析器的逻辑结构 在逻辑上,一个LR分析器结构如下图所示。它是由一个输入符号串,一个下推状态栈,以及一个总控程序和
10、分析表组成。实际上在分析时读入符号是不进栈的。为使分析解释更清楚,我们另设一个符号栈(实际上只有一个状态栈用于存放状态)。,状态栈,状态栈,符号栈,输入串,2.LR分析器工作原理,LR分析器核心是分析表,分析表由两个子表组成:1)分析动作表 其中:S,S2,Sn 为分析器各状态 a,a2 am 为文法的全部终结符号和句子界限符 ACTIONSi,aj 指明,当状态Si面临输入符号aj时应采取的分析动作。有如下四个取值:ACTION Si,aj=S 移进动作,当前输入符号进桟 ACTION Si,aj=rj 按第j个产生式进行归约 ACTION Si,aj=acc 接受 ACTION Si,aj
11、=ERROR 出错,2)状态转换表 其中:,p是文法字汇表中全部非终结符号和终结符号 S,S,Sn为分析器各状态 GOTO Si,Xj指明当状态Si面对文法符号Xj时下一状态是什么,(2)LR分析器基本工作过程 1)分析实例 下面我们通过一个例子来说明LR分析器分析过程 例4.15设已知文法GE:(首先对每个文法规则要编号)=E+T=T*=(E)=i 为了节省空间,我们将文法分析动作表(ACTION)和状态转换表(GOTO)关于终结符的各列对应地进行合并,合并之后分析表如下表所示。(关于表的构造方法以后再讨论),2.LR分析器工作原理,实例LR分析表,表中所引用记号的意义是:a.Sj 把下一个
12、状态j和现行输入符号ai移进栈b.rj 按第j个规则进行归约c.acc接受d.空白格出错标志,报错GOTO表仅对所有非终结符A列出GOTOSm,A的值,表明所要到达的状态的值。,实例分析过程现以输入串为i+i*i为例,给出分析器对它进行分析过程如下表,步骤 状态栈 符号栈 输入串 分析动作 下一状态 1 0#i+i*i#S5 5 2 05#i+i*i#r6 GOTO0,F=3 3 03#F+i*i#r4 GOTO0,T=2 4 02#T+i*i#r2 GOTO0,E=1 5 01#E+i*i#S6 6 6 016#E+i*i#S5 5 7 0165#E+i*i#r6 GOTO6,F=3 8 0
13、163#E+F*i#r4 GOTO6,T=9 9 0169#E+T*i#S7 7 10 01657#E+T*i#S5 5 11 016575#E+T*i#r6 GOTO7,F=10 12 0165710#E+T*F#r3 GOTO6,T=9 13 0169#E+T#r1 GOTO0,E=1 14 01#E#acc,2)LR分析器基本工作过程 LR分析器的工作是在总控程序控制下进行,其过程如下:分析开始时,首先将初始状态S及句子左界限符#推入分析栈和输入串构成一个三元式为(S,#,a1a2an#)其中S为初态,#为句子左界限符,a1a2an是输入串,其后#为句子右界限符。设在分析的某一步,分析栈
14、和余留输入符号串表示为(S0S1Sm,#X1X2Xm,aiai+1an#)这时用当前栈顶状态Sm及正扫视的输入符号ai组成符号对去查分析动作表,并根据分析表中元素ACTIONSm,ai所规定的动作进行分析。,2.LR分析器工作原理,a.若ACTIONSm,ai移进S,这表明句柄尚未在栈顶部形成,正期待着移进输入符号以形成句柄,故将当前输入符号ai推入栈中,其三元式变为(S0S1Sm,#X1X2Xmai,ai+1ai+2an#)然后以符号对(Sm,ai)查状态转换表,若相应表元素为 GOTOSm,aiSm+1 再将此新状态Sm+1推入栈中,则 三元式变为(S0S1SmSm,#X1X2Xmai,a
15、i+1ai+2 an#),分析动作表每一元素ACTIONSm,ai所规定动作不外是下列四种可能之一:,2.LR分析器工作原理,b.若ACTIONSm,ai归约rj,其中rj是指文法中第j个规则,r是规则右部长度。此时按规则执行一次归约动作,这表明栈顶部的符号串m-r+1m-r+2m已是当前句型(对非终结符)的句柄。按第j个产生式进行归约,此时将分析栈从顶向下的r个符号退出,使状态Sm-r变成栈顶状态,再将文法符号推入栈中,其三元式为(S0S1Sm-r,#X1X2Xm-r,aiai+1an#)然后再以(Sm-r,)查状态转换表,设 GOTOSm-r,Sk,将此新状态推入栈中则三元式变为(S0S1
16、Sm-rSk,#X1X2Xm-RA,aiai+1an#)归约动作不改变现行输入符号,输入串指示器不向前推进,它仍然指向动作前的位置。,2.LR分析器工作原理,c.若ACTIONSm,ai接受acc,则表明当前输入串已被成功地分析 完毕,则三元式不再变化,宣布分析成功。d.若ACTIONSm,ai报错ERROR,则三元式变化过程终止,报告错误。重复上述,直到在分析某一步,栈顶出现“接受状态”或“出错状态”为止。对于前者,其三元式变为(SSz,)其中为文法开始符号,Sz则为使ACTIONSz,“接受”的唯一状态。一个分析器工作过程就是一步一步地变换三元式,直至执行“接受”或“报错”为止。,2.LR
17、分析器工作原理,实例分析过程现以输入串为i+i*i为例,给出分析器对它进行分析过程如下表,步骤 状态栈 符号栈 输入串 分析动作 下一状态 1 0#i+i*i#S5 5 2 05#i+i*i#r6 GOTO0,F=3 3 03#F+i*i#r4 GOTO0,T=2 4 02#T+i*i#r2 GOTO0,E=1 5 01#E+i*i#S6 6 6 016#E+i*i#S5 5 7 0165#E+i*i#r6 GOTO6,F=3 8 0163#E+F*i#r4 GOTO6,T=9 9 0169#E+T*i#S7 7 10 01657#E+T*i#S5 5 11 016575#E+T*i#r6 G
18、OTO7,F=10 12 0165710#E+T*F#r3 GOTO6,T=9 13 0169#E+T#r1 GOTO0,E=1 14 01#E#acc,一、简单优先文法分析法 三、优先函数及其构造 1.与文法有关的一些关系定义 1.优先函数定义 2.构造文法关系传递闭包 2.优先函数矩阵的构造 和自反传递闭包 3.利用优先函数矩阵进行语法分析 3.文法优先关系概念 四、LR分析法 4.文法优先关系的构造 1.LR分析法一般概述 5.简单优先文法 2.LR分析器工作原理 6.简单优先文法分析算法 3.LR(0)分析表构造二、算符优先分析法 4.SLR(1)分析表构造 1.算符优先关系概念 5.
19、LR(1)分析表构造 2.算符优先文法 6.LALR分析表构造 3.算符优先关系的构造方法 五、二义性文法的应用 4.最左素短语 1.问题的提出 5.算符优先分析算法 2.二义性文法分析表的构造,第四章 语法分析,4.3 自底向上语法分析,4.3 自底向上语法分析 LR(0)分析就是LR(K)分析当的情况,就是指在分析每一步,只要根据当前栈顶状态,就能确定应采取何种分析动作,而无需向前查看输入符号。为了构造LR分析表,首先引入规范句型活前缀的概念。(1)规范句型的活前缀 字的前缀:是指字的任意首部。如字abc的前缀有,a,ab,abc.活 前 缀:规范句型(右句型)的一个前缀,如果它不含句柄后
20、任何符号,则称它是该规范句型的一个活前缀。也就是说在活前缀右边增添一些终结符号之后,就可以成为规范句型。,在LR分析过程中的任何时候,栈里的文法符号X1X2Xm应该构成活前缀,把输入串的剩余部分配上之后即成为规范句型(如果整个输入串确实构成一个句子的话。),如:S+abcdef,其中cd是句柄,则,a,ab,abc,abcd是该规范句型的活前缀,而abcd是包含句柄的活前缀。,3.LR(0)分析表的构造,实例分析过程现以输入串为i+i*i为例,给出分析器对它进行分析过程如下表,步骤 状态栈 符号栈 输入串 分析动作 下一状态 1 0#i+i*i#S5 5 2 05#i+i*i#r6 GOTO0
21、,F=3 3 03#F+i*i#r4 GOTO0,T=2 4 02#T+i*i#r2 GOTO0,E=1 5 01#E+i*i#S6 6 6 016#E+i*i#S5 5 7 0165#E+i*i#r6 GOTO6,F=3 8 0163#E+F*i#r4 GOTO6,T=9 9 0169#E+T*i#S7 7 10 01657#E+T*i#S5 5 11 016575#E+T*i#r6 GOTO7,F=10 12 0165710#E+T*F#r3 GOTO6,T=9 13 0169#E+T#r1 GOTO0,E=1 14 01#E#acc,(2)LR()项目 1)活前缀与句柄之间的关系 作为规
22、范句型的活前缀不含有句柄后任何符号。因此,前缀与句柄的关系可能有三种情况:,活前缀已包含句柄全部符号,这表明规则的右部符号串已在分析栈顶,因此相应的分析动作应是用此规则进行归约,称可归约的活前缀。我们用 表示,3.LR(0)分析表的构造,4.3 自底向上语法分析,活前缀中只含句柄一部分符号,意味着形如规则12的右部子串1已出现在栈顶,正期待着从余留输入串中看到能由推出的符号串。我们用表示 活前缀不包含句柄的任何符号,这表明规则的右部符号串不在分析栈顶,正期待从余留输入串中由规则的所能推出的符号串。我们用表示,3.LR(0)分析表的构造,4.3 自底向上语法分析,2)LR(0)项目我们把右部某位
23、置上标有圆点的规则称为相应文法的一个LR(0)项目。特别地,对形如的规则,相应()项目为。例如,一个()项目 12 一个()项目 一个()项目若 一个()项目例如 一个规则=aBC,根据圆点的位置不同可以有四个LR()项目:aBC 正期待着从余留输入串中由aBC推出的符号串进栈 aBC a已进栈,正期待着从余留输入串中由BC推出的符号串进栈 aBC aB推出的符号串进栈,正期待着从余留输入串中由C推出 的符号串进栈 aBC aBC推出的符号串进栈 对于规则对应项目数为个。(表示所含字符的个数)显然,不同的()项目反映了分析过程中栈顶的不同情况。,3.LR(0)分析表的构造,(3)构造识别活前缀
24、的有穷自动机(FA)M Knuth证明了一个LR文法的右句型的所有活前缀能够为有穷自动机所接受我们可以把文法G中每一个项目作为非确定有穷自动机的一个状态,构造NFA,然后再将其确定化为DFA。1)文法G的全部项目例4.16 设有文法GE=(E,A,B,a,b,c,d,P,E),其中P由下列规则组成:E=aA A=d E=bB B=cB A=cA B=d,3.LR(0)分析表的构造,S=E E=aA A=d E=bB B=cB A=cA B=d 将文法拓广的目的是使文法只有一个开始符作为左部规则,这样构造出来的分析器有唯一接受项目。否则E=aA和E=bB就有两个归约项目。,0,为了方便起见,我们
25、在上述文法中引入一个新的开始符号S,并将S=E作为第0个规则,从而得到所谓G的拓广文法G,显然,L(G)=L(G)。,3.LR(0)分析表的构造,对于文法G,其LR(0)项目有 S=E A=cA E=bB S=E A=cA B=cB E=aA A=d B=cB E=aA A=d B=cB E=aA E=bB B=d A=cA E=bB B=d,说明:(1)可用一个整数对n,m来表示一个LR(0)项目,其中第一个整数n用指 明产生式的编号,第二个整数m则用来指明圆点所处的位置。例如,项目(1)可表示为0,0,项目(7)表示3,1等等。,3.LR(0)分析表的构造,(2)我们可根据它们不同作用,将
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- new 第四 语法分析

链接地址:https://www.31ppt.com/p-6513018.html