文章目录
一、随缘分析
其实就是一个不断改进分析算法并建立分析表的过程。
二、根据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即可。