使用 SLR 解析验证给定语法是否接受字符串 id * id + id 考虑语法 E → E + T E → T T → T ∗ F T → F F & 的 SLR 解析表
解决方案
最初,LRParser处于状态0。
将$放在字符串的末尾,即id*id+id$。
第一行,我们栈顶有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定义的条目都被视为“错误”。