首页 文章资讯内容详情

使用 SLR 解析验证给定语法是否接受字符串 id * id + id 考虑语法 E → E + T E → T T → T ∗ F T → F F & 的 SLR 解析表

2026-06-02 1 花语

解决方案

最初,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定义的条目都被视为“错误”。