LR(1)分析法

目录

1.LR(1)分析表和LR(1)文法

2.SLR冲突消解存在的问题

(1)LR(1)和SLR(1)分析表构造方法的对比

(2)SLR冲突消解存在的问题

3. LR(K)项目

4.有效项目

5. 构造LR(1)分析表的方法

6.例题分析


1.LR(1)分析表和LR(1)文法

(1)按上述算法构造的分析表,若不存在多重定义的入口(即,动作冲突)的情形,则称它是           文法G的一张规范的LR(1)分析表。

(2)具有规范的LR(1)分析表的文法称为一个LR(1)文法。

(3)使用LR(1)分析表的分析器叫做一个规范的LR分析器。

(4)LR(1)状态比SLR(1)多。

(5)LR(O)∈ SLR(1)∈ LR(1)∈无二义文法。

2.SLR冲突消解存在的问题

(1)LR(1)和SLR(1)分析表构造方法的对比

我们先来看看这两种构造方法有什么不同,经过观察我们可以看出主要是第二步有所不同,故用SLR(1)的解决方法来解决LR(1)显然是不合适的。

(2)SLR冲突消解存在的问题

LR(1)分析法_第1张图片

我们来举个例子

LR(1)分析法_第2张图片

我们进一步看一下就会注意到当状态2处于分析栈的栈顶,而面临输入符号是等号的时候并不能对栈顶L进行规约,在这个文法当中,在他的规范句型当中没有以“R=”为前缀的规范句型,有以“*R=”为前缀的规范句型,故不能使用SLR(1)解决方法。

3. LR(K)项目

LR(1)分析法_第3张图片

4.有效项目

LR(1)分析法_第4张图片

5. 构造LR(1)分析表的方法

(1)把G拓广为G'

(2)对G'构造LR(1)项目集规范族C和活前缀识别自动机的状态转换函数GO

(3)使用C和GO,构造LR(1)分析表

LR(1)分析法_第5张图片  LR(1)分析法_第6张图片LR(1)分析法_第7张图片

 LR(1)分析法_第8张图片

 LR(1)分析法_第9张图片

6.例题分析

补充说明:展望串的详细求法

1.文法开始符  FOLLOW集

2.先看前面再看后面

A->αBβ(β为空就照抄,β不为空判断β是否为终结符,是的话就将β加入,不是的话就求First(β),然后加入)

B->.....

给大家举个例子

LR(1)分析法_第10张图片

我们先来看第一个式子,此时FOLLOW集根据规则要将#加入,所以不管如何,第一个展望串一定是#,再来看第二个式子,此时左边为S,我们可以发现第一个式子点的右边是S,S的后面没有东西了,就照抄第一个式子的展望串#,我们再来看第三个式子,这时左边为B,我们可以发现第二个式子点的右边为B,且B的后面还跟了一个非终结符B,此时需要求B的First集,为{a,b},故此时的展望串为a/b,第四个式子和第三个式子是一样的 

 我们再来看几道例题

LR(1)分析法_第11张图片

LR(1)分析法_第12张图片

它的LR(1)项目集的每一个规范族连成了识别这个活前缀的DFA
首先第一个项目集是从文法的开始符号的定义开始,展望串是#,由于S在点后面,所以关于S的产生式S定义为BB,这个也要进来,注意这个#,他的展望串按照定义,第一个项目S后面没有符号,所以他的转往串就是原来的展望串#,这个项目进来之后,点后面是非终结符B,那么关于B的两个产生式的项目也应该进来。比如说B定义为aB,点在最左边,将来把aB规约成B的时候,第二个项目它后面跟着的是B后面的,我们可以推一下,算他的FIRST集合你会发现是a和b,将来把aB归约成B的时候,有两个展望串要么是a要么是b,也就是说当aB出在栈顶,面临的输入的单词是a或者b的时候就可以归约成B了,所以展望信息是这么定的,同样对于B定义为b这个产生式,它的展望信息也都是a和b(见左图)。那么为了书写方便我们把关于同一个项目的LR(0)项目的不同的展望信息,给他合成一个(见右图)。

 LR(1)分析法_第13张图片LR(1)分析法_第14张图片

从I0出发继续使用go,对于I0的第一个项目,从I0出发识别S之后,点从S之前移到了S之后,展望信息不变,同理里,将识别B,a,b以后的项目也移入其中。

LR(1)分析法_第15张图片

 DFA最终结果

LR(1)分析法_第16张图片

接下来我们要利用识别活前缀的DFA来构造LR(1)分析表

LR(1)分析法_第17张图片

对于状态0,识别a是转到3,所以说0这一行a这列上s3,因为它这里识别a呀是个终结符点后面是终结符a,这个归约项目告诉我们最后一个项目告诉我们面对b的时候要移入,而且转换关系告诉我们要移入状态4,然后goto表,I0识别S是到I1,所以是1状态,识别B到2状态,然后状态1这是个接受状态,在1状态面临#的时候,要接受,在ACTION对应位置填上acc,再检查状态2,识别a,到状态6所以移入到6,识别b移入b之后到状态7,识别B之后到状态5,goto表这一项设成5,状态3也是这个道理。我们再看状态4,这是个归约项目,说在状态4上面临a或者b的时候就要归约,用第三个产生式做规约,我们再来看状态五,当状态5面临#的时 用第一个产生式做归约。后面的过程和前面的也是一样的。

LR(1)分析法_第18张图片

 我们求得了LR(1)分析表,接下来我们要对一个串进行LR(1)分析

LR(1)分析法_第19张图片

 这一个知识点的内容,我已经在前面的文章中详细叙述了LR分析法_驼驼学编程的博客-CSDN博客1.基本概念(1)LR分析器结构(2)LR分析表大家重点关注一下这个LR分析表,我们后续的分析都将围绕这个LR分析表展开https://blog.csdn.net/qq_55168827/article/details/124298883所以我直接放出答案了

LR(1)分析法_第20张图片

你可能感兴趣的:(编译原理,编辑器)