最初,LRParser处于状态0。
将$放在字符串的末尾,即id*id+id$。
堆输入字符串原因0id*id+idAction[0,id]=s5∴Shiftidandstate50id5∗id+id$Action[5,∗]=r6.∴ReducebyF→id.goto(0,F)=30F3∗id+id$Action[3,∗]=r4,ReducebyT→Fgoto(0,T)=20吨2∗id+id$Action[2,∗]=s7,shift∗,70T2*7身份证+身份证$Action[7,id]=s5,shiftid,50T2*7id5+id$Action[5,+]=r6,ReducebyF→idgoto(7,F)=100T2*7F10+id$Action[10,+]=r3S,ReducebyT→T∗F,goto(0,T)=20吨2+id$Action[2,+]=r2,ReducebyE→Tgoto(0,E)=10E1+id$Action[1,+]=s6,Shift+,60E1+6身份证$Action[6,id]=s5,Shiftid,5.0E1+6id5$Action[5,$]=s6,ReducebyF→id,goto(6,F)=30E1+6F3$Action[3,$]=r4,ReducebyT→F,goto(6,F)=90E1+6T9$Action[9,$]=r1,ReducebyE→E+T,goto(0,E)=10E1$操作[1,$]=接受第一行,我们栈顶有0,要处理id符号。因此,检查行(0)和列(id),即Action[0,id]=s5,即,将id从字符串和状态5移到堆栈上。
在第二行中,Action[5,*]=r3表示减少产生式编号6,即F→id。从堆栈中弹出id并压入F。然后看到goto(0,F)=3,因此将3压入堆栈。在第7行,Action[10,+]=r3,即减少生产数3,即T→T∗F。
从堆栈中弹出T2*7F10,将T压入堆栈。然后看到goto[0,T]=2。因此,将2压入堆栈InLastRowAction[1,$]=accept。这意味着解析器将接受字符串。
SLR解析表算法
SLR解析表有两部分
行动
去
可以使用以下算法填充操作和转到表-
算法
输入-一个增强的语法G
输出-SLR解析表
方法
最初构造一组项目
C={I0,I1,I2……In}其中C是语法的一组LR(0)项。
解析动作基于每个项目或状态I1。
各种行动是-
如果A→α∙aβ在Ii中并且转到(Ii,a)=Ij则设置Action[i,a]=shiftj"。
如果A→α∙在Ii中,则对所有符号a设置Action[i,a]为“减少A→α”,其中a∈FOLLOW(A)。
如果S′→S∙在Ii中,则动作表Action[i,$]=accept"中的条目。
SLR表的goto部分可以填充为-状态i的goto转换仅考虑非终结符。如果转到(Ii,A)=Ij则转到[i,A]=j
所有未由规则2和3定义的条目都被视为“错误”。