编译原理:语法分析(自下向上)

发布于:2022-11-15 ⋅ 阅读:(890) ⋅ 点赞:(0)

一、随缘分析

其实就是一个不断改进分析算法并建立分析表的过程。
在这里插入图片描述

二、根据LR分析表分析

1.LR分析表结构

在这里插入图片描述
其中,状态表示的是当前状态,其中有两个栈,分别是状态栈和符号栈。
sn表示入栈之后进入n状态,rn表示出栈规约选择第n个表达式,action表示遇到符号,GOTO表示遇到非终结符,数字表示要进入的状态。

2.过程

1.初始时状态为0,符号位$。然后遇到第一个字符b

0
$

2.遇到第一个符号b,即0号状态遇到b。通过查表,b入栈,状态变为4号状态。

0 4
$ b

3.继续读入下一个字符,是a,4号状态遇到a。使用第三个表达式进行规约。b规约成B,4号状态出栈。

0
$ B

4.此时0号状态遇到B,进入2号状态:

0 2
$ B

5.继续读入字符,2号状态遇到a,入栈后变成3号状态。

0 2 3
$ B a

6.继续读入b,此时3号状态遇到b进入4号状态

0 2 3 4
$ B a b

7.此时没有字符了,4号状态读入空,使用3号表达式进行规约

0 2 3
$ B a B

8.3号状态遇到B进入6号状态

0 2 3 6
$ B a B

9.6号状态遇到空,使用2号表达式进行规约

0 2
$ B B

10.2号状态遇到B进入5号状态

0 2 5
$ B B

11.5号状态读入空使用1号表达式进行规约

0 1
$ S

12.1号状态遇到空acc分析完毕

其中什么时候读入,什么时候判断呢?据观察只有状态和符号集都发生更新的时候才进行判断操作,否则读入字符再判断。

三、建立LR分析表

使用·的方式来表示读取到的位置,并判断下一个要进入的状态。
改进的顺序是:LR(0)->SLR->LR(1)->LALR
这里我重点介绍LR(1)的建立过程。

1.LR(0)

在这里插入图片描述

2.SLR

在这里插入图片描述

3.LR(1)

在这里插入图片描述
在这里插入图片描述
方法:
关键就在于第一次书写和继承的问题,当第一次书写使用L的时候,它的后面可以跟=号,第二次用到L的时候是R->L使用的,为空,将两者分开。其中从某个状态到达另一个状态需要继承,在同一个状态内进行推导出来的也需要继承。

4.LALR

在这里插入图片描述
在这里插入图片描述

四、二义性文法的LR分析

在这里插入图片描述
在这里插入图片描述

五、LR分析中的错误处理

在这里插入图片描述
其中en对应着一种错误处理方式,我们只需要对这些错误分类为en即可。

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到