收藏 分享(赏)

第四部分 第五-七章(语法分析).ppt

上传人:fmgc7290 文档编号:8311837 上传时间:2019-06-19 格式:PPT 页数:198 大小:1.73MB
下载 相关 举报
第四部分 第五-七章(语法分析).ppt_第1页
第1页 / 共198页
第四部分 第五-七章(语法分析).ppt_第2页
第2页 / 共198页
第四部分 第五-七章(语法分析).ppt_第3页
第3页 / 共198页
第四部分 第五-七章(语法分析).ppt_第4页
第4页 / 共198页
第四部分 第五-七章(语法分析).ppt_第5页
第5页 / 共198页
点击查看更多>>
资源描述

1、第四部分 语法分析,第四部分内容,4.1 自顶向下分析方法(第5章) 4.2 递归下降分析(递归子程序法)(第5章) 4.3 LL(1)分析方法(第5章) 4.4 自底向上分析方法(第6章) 4.5 算符优先分析法(第6章) 4.6 LR分析方法(第7章),一、语法分析是编译过程的核心部分 语法分析的任务:按照文法,从源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备。 语法分析程序的定义:执行语法分析任务的程序称为语法分析程序,也称为语法分析器,它是编译程序的主要部分之一。 语法分析方法的分类:分成两大类。自顶向下分析和自底向上分析。,二、语法分析的数学模型下推自

2、动机,(1)下推机的逻辑结构 PDA的读、写、状态转移动作决定于以下三个因素: 当前所处状态 读头所指符号 下推栈栈顶符号 一个输入串能为PDA所接受,仅当输入串读完,下推栈变空;或者输入串读完,控制器到达某些终态。,(2)下推机的定义 下推自动机是一个七元组M=(Q, ,H, ,q0,z0,F),其中: Q是控制器的有限状态集; 是输入字母表; H是下推栈内字母表; 是Q()H到QH*的有限子集映射; q0Q是控制器的初始状态; z0H是下推栈的栈初始符; F为Q的子集,是控制器的终态集。,(3)说明 映射函数描述PDA动作与状态的变化(q,a,z)=(q1,1),(q2,2),(qn,n)

3、其中q,qi(1in) Q,a*,zH含义:控制器当前状态为q,下推栈栈顶符号为z,输入符号为a(可为空)情况下,状态转换到序偶集(qi,i), qi为下一状态, i为代替z的栈顶符号串。 映射函数不是单值映射,且下推机有两种接受状态:串读完进入终态和串读完栈空。例子:LL(1)语法分析器与PDA的对应关系设CFG G=(VN ,P,S),构造一个不确定的PDA M=(Q,H,q0 ,z0 ,F),其中Q=F=q0 ;H=VN ;z0=S; 映射关系的构造方法如下:对于形如A 产生式,有(q,A)=(q,), (q,a,a)=(q, )其中a。,4.1 自顶向下分析方法,4.1.1 带回溯的自

4、顶向下的分析方法 4.1.2 存在的问题及解决方法,4.1.1 带回溯的自顶向下的分析方法,思路:对任一输入符号串,通过一切可能的办法,从树根结点(识别符号)出发,根据文法自上而下地为输入串建立一棵语法树;或者说,从识别符号开始,根据文法试图为输入串建立一个推导序列。 特点:是自顶向下分析的一般方法,分析过程的本质是一种试探过程。,以上文法没有左递归,且有以下两个特点: (1)每个产生式的右部都由终结符号开始。 (2)如果两个产生式有相同的左部,那么它们的右部由不同的终结符开始。,举例 (1)确定的自顶向下分析,以上文法没有左递归,且有以下特点: (1)产生式的右部不全是由终结符开始。 (2)

5、如果两个产生式有相同的左部,其右部是由不同的终结符或非终结符开始。 (3)文法中无空产生式。,以上推导过程的特点:在第二步到第三步的推导中,即abAS = abS时,因为当前输入符号为d,而最左非终结符A的产生式右部的开始符号集合都不包含d,但A可以推出空,所以d的匹配任务就只能依赖于A后面的符号,所以 选用产生式“A 空”进行推导,句型中紧跟A后面的符号为S,S产生式右部的开始符号中包含了d,所以可匹配。,假定有文法GS:(1) S:=cAd (2) A:=ab | a对输入串w=cad。要求自上而下地构造w的语法树。解决过程:,(2)非确定的自顶向下分析,分析:通过上述解答过程可以看出:自

6、顶向下地为输入符号串w建立语法树的过程实际上就是设法建立w的一个最左推导序列。比如对于上例中的输入串w可以通过如下的推导过程将其推导出来:S=cAd=cad由于对输入串是自左向右扫描的,因此用最左推导,只有用最左推导,才能保证按扫描顺序去匹配输入串。,问题: 缺陷:不能处理左递归文法(教材P88图5.6、图5.7)。 缺点:存在回溯,算法效率低。 (另:更多例子参阅教材P91),4.1.2 存在的问题及解决方法,一、左递归问题直接左递归间接左递归二、回溯问题实现不带回溯的自顶向下分析的条件 文法非左递归 首符号集不相交,(一) 左递归问题(P88) 直接左递归自顶向下分析方法不能处理具有左递归

7、性的文法的原因: 例如规则U:=U是一条左递归规则,为了实现用U匹配输入串,又会遇到要用U去匹配。故又要启用上述规则的右部符号串U来完成匹配工作。如此循环下去而无法终止。,方法:用第二章中介绍的重复和选择表示法(扩充的BNF表示)去改写左递归规则。 例如:规则: E:=E+T | T改写为: E:=T+T规则: T:=T*F|T/F|F改写为: T:=F*F|/F改写后的文法消除了直接左递归,且改写前后的文法是等价的。,将直接左递归规则转换成使用重复表示法的等价规则的处理原则: 1. 规则1(提取因子):当出现规则U:=xy|xw|xz时,用规则U:=x(y|w|z)代替。其中,圆括号是元符号

8、。特例:对规则U:=x|xy,则转换为U:=x(y|),其中是空符号。,2. 规则2令U:=x|y|z|Uv是一组规则,它具有一个直接左递归右部且位于最后。该规则表明:语法类U的成员是由x或y或或z其后随有零个或多个v组成的。因此,可以把这组规则等价变换成U:=(x|y|z)v。,算法: 使用规则1,通过提取因子将规则改写成满足以下要求的形式:相对于某个非终结符号,至多只有一个直接左递归的右部; 使用规则2,将规则改写为不含直接左递规的扩充的BNF形式,以消除直接左递归。,例题: 1. 规则:E:=E+T|T(1)变形为:E:=T|E+T(2)由规则2,改写为:E:=T+T 2. 规则:T:=

9、T*F|T/F|F(1)规则1,改写为:T:=F|T(*F|/F)(2)规则2,改写为:T:=F(*F|/F)(3)删去圆括号为:T:=F*F|/F, 间接左递归 要求: (1)文法没有回路(即没有形如A=A的推导) (2)不存在形如:A:=的规则。 则可以按下述算法消除文法的左递归性。,消除左递归算法(1): 把G的非终结符整理成某种顺序A1, A2, An。 for i:=1 step 1 until n dobeginfor j:=1 step 1 until i-1 do把每个形如Ai:= Ajr的规则替换成Ai:= 1r2rkr,其中Aj:= 12k是当前的全部Aj 规则;消除Ai规

10、则中的直接左递归end 化简由所得的文法,删除所有多余规则。,例题:有文法GS:S:=Qc|c Q:=Rb|b R:=Sa|a 解: 该文法有间接左递归。例如有S= Qc = Rbc= Sabc+ 即 S=Sabc (1)首先将非终结符号排列成:R,Q,S的顺序。 (2)将R代入Q得:Q:=Sab|ab|b将Q代入S得: S:=Sabc|abc|bc|c消除S的直接左递归:S:=(abc|bc|c)abc (3)处理后的文法为:S:=(abc|bc|c)abc Q:=Sab|ab|b R:=Sa|a化简后的文法为:S:=(abc|bc|c)abc,消除左递归算法(2)1,设G是一上下文无关文法

11、,VnX1,X2,Xn,对每个形如 Xi1 | 2 | m 的产生式,根据的开始符号作如下等价变换: (1)将“|”表示成“”, “”表示成“” (2)以非终结符号Xi引导的i表示成:Xi i (3)以终结符号引导的所有i之“和”看成常数项,表示成: i 变形后的产生式为: XiX11i + X22i + + Xnni +i (如产生式不含有以Xi打头的候选式,则相应的系数为) 产生式集可表示为:11 12 1n 21 ( X1, X2, , Xn) ( X1, X2, , Xn) (1,2 ,n)n1 nn 即:X=XA+B,且其通解为:X=BA* 化简 X=BA* ?,1j蒋立源. 编译原

12、理M. 西北工业大学出版社. P9194,消除左递归算法(2),设:z11 z12 z1n z21 A* = Z = I = zn1 znn 则可得以下矩阵方程组:X=BZZ=I+AZ解以上方程组并化简即可得到不含左递规的文法例题: S-Sa|Ab|aA-Sc,(二)回溯问题(P91) (1)消除回溯的理由 前面介绍的带回溯的自顶向下的分析方法实际上采用了一种穷尽一切可能的选择试探法(三种回溯情形举例:教材P91) ,回溯需要记住每一步分析的现场,浪费时间和空间,因此,效率低,代价高。要构造一个行之有效的自顶向下的语法分析程序,就必须消除回溯。 (2) 消除回溯的思路 为了避免回溯,要求对文法

13、的任何非终结符号,主要是对那些规则右部有多个选择(候选式)的非终结符号,当要用它去匹配输入串时,能够根据所面临的输入符号准确地选用一个候选式去执行匹配任务,并且工作的结果应是确定的。即若此选择匹配输入串成功,那么这种匹配一定正确无误;若此选择无法完成匹配任务,则任何其他的选择也肯定无法完成。,(3)消除回溯的方法预测与提左因子 1、预测预测就是根据读入的符号选择满足一定条件的候选式:使其第一个符号与读头下的符号相同,或该候选式可推导出的第一个符号与读头下符号相同。所以,对文法有如下要求:令G是一个不含左递归的文法,对每条规则中的每个候选式定义它的终结首符集First()=a|=* a,aVT,

14、设AVN,且A|,如当前用A去匹配输入串,且输入符号为a时,对A的候选式的选择可以分成以下四种情况(当A不能推出时):(1)若aFirst(),而a!First(),选A; (2)若a!First(),而aFirst(),选A; (3)若a!First(),而a!First(),输入有错; (4)若aFirst(),同时aFirst(),终结符首集两两相交,则需要改写文法。,2、改造文法方法:提取公共左因子 (a)假定关于非终结符A的产生式是:A1| 2| n那么可改写成两条规则:A A A 1| 2| |n (b)一般情况,若有关A的产生式是:A1|2| 3|4| 则可写成:A A|A”A

15、1| 2 A”3| 4|,结论: 即当规则右部具有n个选择,从每一个选择出发,都可以推导出一个以上的终结符号串。为了避免回溯,就要保证当用非终结符号A去匹配输入串时,能够根据当前读入的符号准确地选用它的一个候选式执行任务。即对文法的要求是:对任意一个非终结符号,当对应的规则右部有多个选择时,由各个选择所推出的终结符号串的首符号集合要两两不相交。当文法不满足避免回溯的条件时,可以改写文法,对规则右部反复提取左因子。,例题: 规则:U:=xV|xW,(1)改写为:U:=x(V|W)(2)引入一个新的非终结符号Y,则规则变换成:U:=xY Y:=V|W改写后的文法中,非终结符号U的右部只有一个选择,

16、而引入的新非终结符号Y具有两个选择V或W,且这两个选择所推出的终结符号串所组成的头符号集合不相交。,总结:为了实现不带回溯(确定)的自顶向下分析,对文法来说,需要满足下述两个条件: 文法是非左递归的。 对文法的任一非终结符号,若对应的规则右部有多个候选式时,那么,各选择所推出的终结符号串的头符号集合要两两不相交 。,4.2 递归下降分析(递归子程序法),(一)基本思路对文法中每个非终结符号U(分别代表一种语法成分)都编出一个子程序,以完成该非终结符号所对应的语法成分的分析和识别任务。,(二)非终结符号的语法分析子程序的功能用该非终结符号的规则的右部符号串去匹配输入串。 分析过程:按文法规则自左

17、向右地逐个处理每个文法符号,处理方法如下。 (1) 对规则中的终结符号直接与输入匹配; (2)非终结符号则调用该符号的分析子程序来完成匹配,即当编译程序根据文法和当前的输入符号预测到下一个语法成分为U时,即预测到待匹配的输入符号串可以和U推导出的符号串相匹配时,就确定U为子目标,并调用分析和识别U的子程序来完成该子目标的分析匹配工作。,(三)特点在分析和识别某个语法成份的过程中,有可能还要确立其它子目标并调用相应的分析子程序。只有在被调用的分析和识别某语法成分的子程序匹配输入串成功并正确返回后,该语法成分的分析才能继续进行,并最终完成分析任务。所以该分析方法具有明显的预测性特征,并在分析过程中

18、向下确立多级子目标。所以,该方法也被称为面向预测和目标的分析方法(Predictive parser)。,(四)例题Z:=(U)| aUbU:=dZ | Ud | eProcedure Z;if CLASS=( thenbeginnextsym;U;if CLASS=) then nextsymelse errorend;elseif CLASS=a thenbeginnextsym;U;if class=b thennextsymelseerrorend;elseerror;,Procedure U; /首先要消除左递归:U:=(dZ | e) d if CLASS=d thenbeginn

19、extsym;Z;while CLASS=d donextsymend;elseif CLASS=e thenbeginnexteym;while CLASS=d do nextsymendelseerror;,4.3 LL(1)分析方法,基本思路:相应的语法分析将按自左至右的顺序扫描输入符号串,并在此过程中产生一个句子的最左推导。其中第一个 L 表示从左向右扫描输入符号串,第二个 L 表示生成最左推导,括号中的“1”,则表示在分析过程中,每进行一步推导,只要向前查看一个输入符号,便能确定当前所应选用的产生式(规则)。,4.3.1 LL(1)分析器的逻辑结构及工作过程,(一) 逻辑结构(1)L

20、L分析器的数学模型 设CFG G=(VN,P,S),构造PDA如下: M=(Q,H,q0,z0,F),其中Q=F=q0 ;H=VN;z0=S;映射关系的构造方法如下: 对于形如A 产生式,有(q,A)=(q,), 对于a, (q,a,a)=(q, ) 。,(2)LL分析器的逻辑结构 一个LL(1)分析器由一个总控程序、一张分析表和一个分析栈组成,其中: “输入”即待分析的符号串。 分析表M用一个矩阵(或二维数组)来表示,它概括了相应文法的全部信息。矩阵的每一行与文法的一个非终结符号、终结符号或#相关联,而每一列则与文法的一个终结符号或#相关联。 分析表元素MA,a指示分析器应采取的动作。 其中

21、AVtVn#,aVt#,(二) 工作过程第一步:分析开始时,首先将符号#及文法的开始符号S依次置于分析栈的底部,并把各指示器调整至起始位置,即初始格局为然后,反复执行第二步的操作。,第二步:设在分析的某一步,分析栈及余留的输入符号串处于如下的格局:其中,X1,X2,Xm为分析过程中所产生的文法符号,此时,可视栈顶符号Xm的不同情况,分别进行如下操作:,若XmVN,则以Xm及ai组成符号对(Xm,ai)查分析表M。设MXm,ai为一产生式,譬如说XmUVW,此时将Xm从分析栈中退出,并将UVW按反序推入栈中(即用该产生式推导),从而得到新的格局但若MXm,ai=“ERROR”,则调用出错处理程序

22、进行处理;,若Xm=ai#,则表明栈顶符号已与当前正扫描的输入符号匹配,此时应将Xm(即ai)从栈中退出,并将输入符号指示器向前推进一个位置; 若Xm=ai=#,则表明输入串已完全得到匹配,此时即可宣告分析成功而结束分析工作。,分析流程如下:,举例: 原始文法:,消除左递归:,4.3.2 LL(1)分析表的构造方法,LL(1)分析算法对不同的LL(1)文法都相同。即总控部分相同,仅仅是分析表不同,而且总控程序十分简单,容易实现。所以,LL(1)分析方法的核心是构造LL(1)分析表。,(一)定义 符号串的首符号集假定是文法G的任一符号串,即(VTVN)*,定义:FIRST()=a|=*a,aVT

23、 特别是,若=,则规定: FIRST(),即FIRST()是从可能推导出的所有开头终结符号或可能的。,(二)定义非终结符的尾符号集 假定S是文法的开始符号,对于G的任何非终结符A,定义:FOLLOW(A)=a|S=*Aa,aVT 特别是,若S=*A,则规定#FOLLOW(A)。即FOLLOW(A)是所有句型中能够紧接A之后的终结符或#。(三)定义SELECT集(教材P78) 对文法的产生式X, 如*,则SELECT(X)FIRST() 如=*, 则SELECT(X)( FIRST() ) FOLLOW(X),(四)构造First集的算法 1定义法 若XVT,则 FIRST(X)=X。 若XVN

24、,对形如Xa的产生式(aVT),或形如X的产生式,把a或加进FIRST(X)。 设G中有形如XY1Y2Yk的产生式,若Y1VN,则把FIRST(Y1)中的一切非的符号加进FIRST(X);对于一切2ik,若Y1,Y2Yi-1均为非终结符,且FIRST(Yj),1ji-1,则将FIRST(Yi)中的一切非的符号加进FIRST(X);若对一切1jk,均有FIRST(Yj),则将加进FIRST(X)。,关系图法,(1)首先求出能推出的非终结符号,(2)然后按照下面步骤求解,对于文法G的任一符号串=X1X2Xn可按如下的步骤构造相应的FIRST()。置FIRST()=; 把FIRST(X1)中的一切非

25、符号加进FIRST(); 依次进行下述操作:若FIRST(X1),将FIRST(X2)中的一切非的符号加进FIRST();若属于FIRST(X1)及FIRST(X2),将FIRST(X3)中一切非的符号加进FIRST();以此类推。最后,若对于1in,FIRST(Xi),则将加进FIRST()。,(五)构造Follow集的算法 1定义法对于文法的开始符号,令#FOLLOW(S)。 若G中有形如AB的产生式,且,则将FIRST()中的一切非符号加进FOLLOW(B)。(即FOLLOW不含) 若G中有形如AB或AB的产生式,且FIRST(),则FOLLOW(A)中的全部元素均属于FOLLOW(B)

26、。,2关系图法,(六)构造分析表的算法分析表M是一个二维表,每一行对应一个文法符号,每一列对应一个终结符号,元素的赋值规则如下: (1)对规则A,FRIST()中的每一终结符a,置MA,a=“POP,PUSH()”。其中为的倒置。若FIRST(),则对属于FOLLOW(A)的每一终结符号b或#,置MA,b=“A”。 (2)把M中所有Ma,a置为“POP,NEXTSYM”。 (3)把M中所有不能按以上规则定义的元素均置为“ERROR”(出错)。简化表示:可以省略分析表中所有终结符号对应的行。,定义:一个文法G,若它的分析表M不含多重定义元素,则称它是一个LL(1)文法。 一个LL(1)文法是无二

27、义的,它所定义的语言恰好就是它的分析表M所能识别的全部句子。可以证明,一个文法G是LL(1)文法,当且仅当对于G的每一个非终结符A的任何两条不同规则A:=|,下面的条件成立: (1)FIRST()FIRST()=,即由和推导不出以同一终结符a为首字符的符号串;且不应该都能推出空字符。 (2)假若=*,则FIRST()FOLLOW(A)=;即若=*,则所能推出的串的首符号不应在FOLLOW(A)中。 教材P78: (即SELECT(A:=)与SELECT(A:=)不相交,且两者不能同时推出 ),主要结论: 任何LL(1)文法都是无二义性的。 若一文法中含有左递归的非终结符号,则它必然是非LL(1

28、)文法。 存在一种算法,它能判定任一文法是否为LL(1)文法。 存在一种算法,它能判定任意两个LL(1)文法是否产生相同的语言。 不存在这样的算法,它能判定任意上下文无关语言能否由LL(1)文法产生。 非LL(1)语言是存在的。,一、非LL(1)文法的改造 (四种改造情形举例:教材P85),二、非LL(1)文法,4.4 自底向上分析方法,(一)基本思路自底向上的分析方法,也称为“移进归约”法,这种方法的一般过程是:设置一个寄存符号的先进后出栈,称为符号栈,用来记录分析的历史和指示分析的下一步动作。,(二)分析过程在分析进行时,把输入符号一个个地按扫描顺序移进栈里,当栈顶符号串形成一个句柄(为某

29、条规则的右部)时,就进行一次归约,把栈顶构成句柄的那个符号串用相应规则左部的非终结符号来代替。接着再检查在栈顶是否又出现了新的句柄,若出现新的句柄,就再进行归约;若没有形成新的句柄,则再从输入符号串移进新的符号,如此继续直到整个输入符号串处理完毕。最终如栈底为识别符号,则所分析的输入符号串为合法的句子,报告成功;否则,是不合法的符号串,报告错误。,例1:有文法GS:(1) S:=aAcBe (2) A:=b(3) A:=Ab (4) B:=d 分析符号串abbcde,abbcde的移进归约过程:,abbcde语法树的构造过程:,(三)关键问题在自底向上分析中,如何寻找或确定一个句型的句柄,是构

30、造一个自左向右扫描、自底向上分析方法必须要解决的一个关键问题。下面介绍较为常用的两种方法:(1)算符优先分析方法(2)LR分析法,4.5 算符优先分析法,4.5.1 方法概述 4.5.2 直观算符优先分析法 4.5.3 算符优先分析法的进一步讨论,4.5.1 方法概述,思路:算符优先分析法是仿照算术式的四则运算过程而设计的一种语法分析方法。该方法首先要规定运算符之间的优先关系和结合性质,然后利用这种关系,通过比较相邻运算符的优先顺序来确定句型的“句柄”和进行归约。 特点:简单直观,最适用于表达式分析,宜于手工实现。,例:有文法 GE:E:=E+E | E-E | E*E | E/E | (E)

31、 | i试分析句子 i+i-i*(i+i)根据运算符优先顺序和结合原则的规定对句子i+i-i*(i+i) 进行归约,归约过程为: #i+i-i*(i+i) # #E+i-i*(i+i) # #E+E-i*(i+i) # #E-i*(i+i) # #E-E*(i+i)# #E-E*(E+i) # #E-E*(E+E) # #E-E*(E) # #E-E*E # #E-E # (11) #E#该归约过程是唯一的。,在上述的整个归约过程中,起决定作用的是相邻两个终结符的优先关系,所以应用算符优先分析法自底向上地分析句子,解决了前面提到的问题,即:(1)可以只根据相邻运算符的优先关系,就能方便地并且唯

32、一地确定归约的“句柄”; (2)同时还可以发现:该方法可以用来分析二义性文法所产生的语言。上述文法是二义性的,但用算符优先法分析其句子时,其归约过程是唯一的。我们所规定的运算符之间的优先顺序和左结合的原则,就是避免二义性的充分条件。,4.5.2 直观算符优先分析法,(1)算符优先分析的关键在于定义任何两个可能相邻的终结符a和b之间的优先关系要求对于任何两个可能相继出现的终结符a和b具有形式:“ab”或“aQb”,QVN ,定义a,b之间有3种关系: (1)a b a的优先级低于b (2)ab a的优先级等于b (3)ab a的优先级高于b如果a和b在任何情况下不可能相继出现,则a,b之间不可比

33、,即无关系;要与算术中的区分,a b并不意味着b a,比如栈内的大于栈外,同时栈内也大于栈外。,优先关系矩阵示例,(2)直观算符优先分析法的基本步骤 使用两个工作栈OPTR(寄存运算符)和OPND(存放“操作数”和“运算结果”); 开始,将OPTR栈底置为#,输入串尾设置右界符#,OPND初始为空; 令 代表OPTR现行栈顶符号,a存放新输入的符号; 则分析算法的基本步骤如下:,(1)把下一个输入符号读至a中; (2)若a为运算数i,则把它压入OPND,转(1); (3)若a,则调用的处理程序,处理子表达式E(1)E(2),同时,把从OPTR栈顶弹出,然后重新进入(3); (4)若 a,则按优

34、先关系表有两种可能: =(,a=),此时弹出OPTR顶的 (,放弃a中的),然后转(1); =a=#,结束; (5)若a,把a移进OPTR栈,转(1); (6) 与a不存在优先关系,则输入串有错。,4.5.3 算符优先分析法的进一步讨论,(一) 算符优先文法 定义1:设有一文法G,如果G中没有形如U:=VW的规则,其中V和W是非终结符号,那么,就称G为算符文法(OG文法),定义 2设G是一OG文法,并令a和b是任意两个终结符号,U、V、W是非终结符号。终结符号的优先关系定义如下: (1)a b,当且仅当文法中有形如U:=ab或U:=aVb的规则;(a、b同时归约) (2)a b,当且仅当文法中

35、有形如U:=aW的规则,其中W=+b或 W=+Vb;(b归约在前) (3)a b,当且仅当文法中有形如U:=Wb的规则,其中W=+a或W=+aV。 (a归约在前),三种优先关系和归约的先后顺序的图形解释(参见教材P108),定义 3设有一OG文法,如果在任意两个终结符号之间,在 、 和中至多只有一种关系成立,那么,这样的OG文法称为算符优先文法(OPG文法)。,(二) 构造优先关系矩阵定义 1 非终结符号U的FIRSTVT集合 FIRSTVT(U)= a | U=*a 或 U=*Va 定义 2 非终结符号U的LASTVT 集合LASTVT(U)= a | U=*a 或 U=*aV,(1)构造F

36、IRSTVT算法 (LASTVT的构造算法与此类似)Procedure Insert(U,b);if not FU,b thenBeginFU,b:=TRUE;Push(U,b); / 把(U,b)下推进STACKEnd,主程序 F为2维数组,如bFIRSTVT(U),则FU,b:=TRUE BEGINFor 每个非终结符号U和终结符号b doFU,b:=FALSE;初始化为0For 每个形如U:=b或U:=Vb的规则do Insert(U,b)While STACK 非空 doBeginPop (V,b) 记STACK栈顶为(V,b),弹出For 每条形如U:=V的规则 doInsert (

37、U,b)End of While;END,例子:给定如下表达式文法GE: (0)E#E#,(1)EE+T, (2)ET, (3)TT*F, (4)TF, (5)FPF|P, (6)P(E), (7)Pi非终结符号的 FIRSTVT LASTVT如右:,(2)用图形法求FIRSTVT的算法(教材P105),图形法求解结果如右图所示:,(3)构造优先关系表算法For 每条规则U:=x1x2xn DOFor i:=1 TO n-1 DOBEGINIF xi和xi+1均为终结符号 THEN置 xi xi+1;IF xi为终结符号而xi+1为非终结符 THEN置 xi xi+2;IF xi为终结符号而x

38、i+1为非终结符 THENFor FIRSTVT(xi+1)中的每个b DO 置 xi b;IF xi为非终结符号而xi+1为终结符 THENFor LASTVT(xi)中的每个a DO 置 a xi+1;End,例:设文法GS的产生式为:SaAcBe AAb|b Bd,FIRSTVT(S)=a FIRSTVT(A)=b FIRSTVT(B)=dLASTVT(S)=e LASTVT(A)=b LASTVT(B)=d,(三) 算符优先分析算法设计 定义 4文法句型的素短语是满足以下条件的一个短语,它至少包含一个终结符号,并且除它自身之外,不再包含其他素短语。,定理 1一个OPG句型的最左素短语是

39、满足下列条件的最左子串NjajNiaiNi+1aj-1 ajaj aj+1, aj+1 aj+2, ai-2 ai-1, ai-1 aiai ai+1 出现在aj 左端或ai右端的非终结符号一定属于这个素短语。 举例:P116 图6.6 、图6.7,例子: P110,与规范归约的比较:,继续往前扫描寻找素短语尾,找到素短语尾,往栈底搜索找素短语头,找到素短语头,S为分析栈,k为栈顶指针。,注意:(1) 在查找所应归约的最左素短语的过程中,没有用到非终结符号,因此,在符号栈中放不放相应的非终结符号,对分析过程中寻找最左素短语没有影响。(2) 与归约为某个非终结符号相对应, 语义程序分配一个工作单

40、元来存放该子表达式的运算结果。所以,对语义处理程序来说,也不需要知道真正的非终结符号的名字。,算符优先函数及其构造方法,为什么要构造优先函数?对具有n个终结符号(包括句子界符)的算符优先文法,其优先关系矩阵需要n2的存储空间。是否可能将空间消耗控制在n的线性复杂度范围内。,算符优先函数及其构造方法,把每一个终结符与一对整数f()、g()联系在一起,其中f()为终结符在栈内时的优先数,g()为终结符在栈外的优先数。(1)f()与g()的值应满足如下关系 若12 则f(1)g(2)2个优先函数所需空间为2n,(2)优先表与优先函数的关系 1)优先函数并不等价于优先表,在优先表中没有关系的终结符对存

41、在优先函数。 2)有些优先表不存在对应的优先函数f和g。 3)如果存在一对优先函数,则存在无穷多对优先函数。根据不同的算法从优先表转换推演出优先函数时也可能得到不同的结果。,(3)从优先表转换为优先函数的算法 算法一:逐次加1法 1)对所有终结符a(包括#),令f(a)=g(a)=c 2)对所有终结符:若ab且f(a) g(b),则f(a):=g(b)+1若ab且f(a) g(b),则g(b):=f(a)+1若ab且f(a) g(b),则f(a)=g(b)=max(f(a),g(b) 3)重复步骤(2)直至f(a),g(b)不再改变为止。如果f(a)或g(b)的任一值2n+c而步骤(2)还没结

42、束,表示优先函数不存在。,例:由G(E)文法的优先表构造优先函数的过程/P118,第1步:f(+)与g(+)、g(*)、g(#)比较,按算法调整对应的f、g值; 第2步:f(*)与g(+)、g(*)、g(#)比较,按算法调整对应的f、g值; 第n步:f(#)与g(+)、g(*)、g(#)比较,按算法调整对应的f、g值;,以上优先函数的计算迭代三次收敛。不难看出对优先函数每个元素的值都增加同一 个常数,优先关系不变,所以同一个文法的优先关系矩阵对应的优先函数可以不唯一。 但是也有一些优先关系矩阵中的优先关系是唯一的,却不存在优先函数。例如下面的优先关系矩阵:,构造算法二:Bell有向图方法 1)

43、对每个终结符a(包括#),令其对应两个节点fa和ga,画一张以所有fa和ga为节点的有向图,如果ab或a b,就从fa画一弧指向gb,若ab或a b,则从gb画一弧指向fa; 2)令f(a)等于节点fa可达的节点数(包括自身),令g(a)等于节点ga可达的节点数(包括自身); 3)检查构造出来的f(a)和g(a),若与优先表符合则优先函数存在,否则不存在。,Bell有向图举例:,4.6 LR分析方法,4.6.1 概述 4.6.2 LR(0)分析器 4.6.3 SLR(1)分析器 4.6.4 规范LR(1)分析器 4.6.5 规范LALR(1)分析器 4.6.6 语法分析程序的自动生成工具YAC

44、C,基本思路:LR(K)分析器从左到右扫描所给定的输入串,并以相反的方向构造该输入串的最右推导(Right-most Derive即规范推导)。LR(K)分析器根据分析栈的内容以及向前查看输入串中K个符号来决定分析动作。 特点: (1)分析器对源程序中错误的诊断灵敏; (2)分析器对文法适应性强,文法分析能力强; (3)分析器结构复杂,K越大,相应的分析器愈复杂。当K0时,表示在确定分析动作时不需向前查看符号,LR(0)分析器是LR分析器中最简单的一种。LR(0)分析器分析能力弱,实用性差,一般仅作为构造更复杂的LR分析器的基础。,LR分析器的逻辑结构和工作原理,LR分析器的数学模型是下推自动

45、机。该下推机具有一个输入机构,一个分析栈和一个有穷的控制系统。一般来说,其控制系统是一个具有多状态的有穷状态机。,4.6.1 概述,1、下推自动机的定义M =,R,q0,Z0 ,F:有穷状态集 :堆栈字母表:输入字母表R :转换关系() )( *)q0 :初态Z0 :初始堆栈,符号Z0F: 为的子集,是控制器的终态集,2、有穷自动机状态的分类 有穷状态集中的状态分成3类 读状态,当读一个终结符或非终结符时,发生由一个状态到另一状态的状态转移。 归约状态,识别出当前句型的活前缀的句柄部分。处于归约状态时,检测出来的句柄将归约为一个非终结符号。 识别状态,输入串被分析器成功识别。,3、LR(0)分

46、析栈的结构LR(0)分析器的分析栈是一个符号对偶栈。对偶的第一个元素是文法符号。对偶的第二个元素是分析器扫描一个文法符号时所进入的状态。,4、LR(0)分析过程LR(0)分析器由总控程序和分析表两部分组成。分析开始时,栈内的初始状态为S0,即与分析器有关的有穷控制的开动状态。(1)当分析器处于读状态时,它将当前扫描到的符号压入堆栈,并执行由所读符号所指示的状态转移,并将该后继状态也压入栈内;(2)当分析器处于归约状态时,将对偶栈中与句柄对应的部分弹出进行归约,然后执行读操作,读入归约后的符号并压入堆栈。如果归约到的符号为识别符号,则分析器接受所给定的符号串并停机;否则,归约生成的左部符号和当前栈顶状态将确定下一个状态转移。,一、初始情况,二、一般过程,(1)If actionsm,ai= si(shift si) then 分析格局变为,(2)If actionsm,ai= ri(Reduce i) then 表示用第i个产生式AXm-(k-1)Xm进行归约,分析格局变为,然后查goto表,If gotosm-k,A= si then 格局变为,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报