如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
5.3LR分析方法二、LR分析器的逻辑结构:2.分析表的组成:(2)状态转换表也用一个二维数组表示,行代表分析栈栈顶状态,列代表文法符号,数组元素表示当前栈顶为状态为Si面对文法符号为Xj时,应转去的新状态Goto[Si,Xj]。归约:若动作表中对应“归约”,则按指定产生式进行归约,若产生式右部的符号串长度为n,则符号栈栈顶的n个符号为句柄,所以符号栈栈顶n个符号出栈,同时,状态栈顶的n个元素也出栈,归约后的文法符号(非终结符)进符号栈,并据状态转换表查归约后的文法符号所对应的新状态进状态栈;首先直接给出LR分析表分析过程:5.3.1LR(0)分析表的构造二、构造识别活前缀的NFA:(4)转换函数f:2.举例:根据转换函数的规定,可画出NFA的状态图如下:(P127)三.项目的分类:四.获得识别活前缀的DFA:②状态转换图表示(P106):2.方法二:求项目集规范族,每个项目集对应一个DFA状态,它们的全体称这个文法的项目集规范族,下面给出求各个项目集的方法,以便得到识别文法活前缀的DFA.3.DFA的形成过程(举例说明):五.LR(0)文法:六.LR(0)分析表的构造:例:对文法G[S’]S’EEaA|bBAcA|dBcB|dB5.3.2SLR(1)分析表的构造将文法进行拓广,使它成为G’[S’],并有如下项目:4.若为文法构造LR(0)分析表,则:5.解决方法:对LR(0)分析的构造算法进行改造,以避免分析表中的冲突分析动作。实际上在一个状态中,归约项目可以多个,移进项目也可以有多个(去不同状态)。只要归约成的非终结符S的后继符号集与移进符号集不相交,则可以区分开,而避免冲突。二.SLR(1)分析表的改进:i)对于xα.Si若aFirst()且GO[Si,a]=Sj则置Action[Si,a]=Sj2.对于归约项目:Aα.Si若Aα为文法的第j个产生式,则对于任意输入符号a,若aFollow(A),则置Action[Si,a]=rj步骤(1)给出所有项目:(2)构造项目集规范族。(求出所有项目集P111)(4)构造SLR(1)分析表。分析表(5)对输入串i+i*i的SLR(1)分析过程:5.4LR(1)分析表的构造:用S'.S作为初态集的项目,构造识别文法活前缀的DFA如下:下面我们提出一种更强的LR分析法,即LR(1)分析方法来解决这一问题。SLR(1)对于归约项目Aα.只要当前的输入符号为aFollow(A)就进行归约的考虑前提是:由aFollow(A)就断定当前句型含有Aa,而实际上,从逻辑上说,aFollow(A)仅仅意味着某种含有Aa句型的存在,绝不意味着所有的句型都含有Aa句型。对活前缀ae来说。当输入符号c时应移进。所以,在上例中的项目集:S5={Sae.c,Ae.}中,虽然Follow(A)={c,d},但当有输入符号c时不能用Ae进行归约。例如:栈顶为ae输入符号为c,若进行归约,则ae归约后符号栈顶为aA,移进c后成为aAc,但aAc不是文法所规定的规范句型。我们把First()作为用产生式A进行归约的搜索符,用于替代SLR(1)分析法中的Follow(A),并把搜索符号的集合放在项目的后面([A.,a]aFirst())。这种处理方法称为LR(1)方法。(1)闭包函数:3举例:我们仍以G[S’]为例,看项目集的求法:从而得到DFA三.LR(1)分析表构造规则:S0:S'.S,#S.aAd,#S.bAc,#S.aec,#S.bed,#状态5.5LALR(1)分析(简介):例:设文法为:(0)S’→S(1)S→BB合并后:引入合并后的项目集后,弧上标记不变;由同心集导出的弧,改由合并后的项目集导出,弧上标记不变。GO(I,X)仅与项目集的LR(0)项目及文法符号X有关,与搜索符无关。若合并同心集后项目集规范族无分析动作冲突,或构造的LR分析表无冲突,则此表称为LALR(1)分析表。LALR(1)分析表与语法分析总控程序称为LALR(1)分析器,相应的文法称为LALR(1)文法。5.6二义性文法在LR分析中的应用(简介):项目集除了“I4”以外无动作冲突,通过人为的规定终极符的优先级,使得冲突得以解决。