LR(0)分析和SLR

①栈顶出现句柄时规约,否则移入。
②移入项目、代约项目、归约项目
在这里插入图片描述

1.引入开始符,得到增广文法,并且给每个式子编号。(即如果文法开头不是一个非终结符到另一个非终结符的产生式则需要加入,如加入 S’->·S )
2.然后需要构造 LR(0)自动机,首先将增广文法增加的产生式加入I0状态当中,并且加入了一个圆点,圆点后的符号是即将处理的符号,然后将待处理的符号在蕴涵式左边的字母写出来(例如I0的E、T、F)。然后按照圆点后要处理的字母都引出一个箭头指向下一个状态。当S’->S·的时候,是accept(如下图)。

在这里插入图片描述

3.然后构造 LR(0)分析表
在这里插入图片描述
规则如下:列是状态数,action行是终结符,GOTO是非终结符。
填归约的时候,如果已经可以规约了,那么要在归约的规则左部的follow集的元素里面填上rj,其中j是之前给每个式子编的号。
在这里插入图片描述
4.判断是不是LR(0)文法
如果文法对应的自动机中不存在移进-归约冲突和归约-归约冲突则为 LR(0)文法。换句话说LR(0)文法分析不能解决这两种冲突,所以范围最小。移进-归约冲突就是在同一个项集族中同时出现了可以移进的产生式和可以归约的产生式。归约-归约冲突类似。
(就是只能有移入项目或者只有一个规约项目)
5.判断是不是SLR文法
SLR文法分析过程可以解决归约-归约冲突,但是不一定能解决移进-归约冲突。
所以当有出现移进-归约冲突(接受也算归约),要把规约的产生式左部的follow集和移进的非终结符进行相交,若空集,则冲突可解决)
LR(0)有时候在分析的时候可以不需要使用状态转换机,可以构建状态转换表。
在这里插入图片描述
#表示的是归约项目达成。
SLR(1)可以构建表来分析。
在这里插入图片描述
其中空串不要显示。
而且若达到归约项目,要求出例如S0状态的A的follow集,后继符号里面就是那个。

LR(0)处理输入输入的各个步骤

在这里插入图片描述
这个结合分析表会很好写的。
首先应该明确的就是stack栈和symbols栈是相同的,二者同增同减。
输入栏首先为id,第一行栈值为0,对应LR(0)自动机为I0,I0从id到I5,所以第二行stack增加一个5。然后第二行开始,符号表增加id,action是那个项目集的产生式。然后是规约按照产生式,第三行id变成F,并且由于id弹出,stack中5也弹出,然后以0为状态,F是到5,所以stack中增加一个5。倒二行中,因为symbols中减少两个,所以stack中也减少两个。

在这里插入图片描述