繁体   English   中英

SLR(1) 解析器在语法中带有 epsilon 转换

[英]SLR(1) parser with epsilon transitions in the grammar

我正在根据以下语法编写 SLR(1) 解析器:

1) S -> aSb
2) S -> cB
3) B -> cB
4) B -> ε

首先,我开始通过增加S' -> S产生式的增强语法找到关联的 LR(0) 自动机并开始计算各种状态。 我发现的状态是:

I0 = {S'->•S, S->•aSb, S->•cB}
𝛿(I0, S) = I1; 𝛿(I0, a) = I2; 𝛿(I0, c) = I3;
I1 = {S'->S•}
I2 = {S->a•Sb, S->•aSb, S->•cB}
𝛿(I2, S) = I4; 𝛿(I2, a) = I2; 𝛿(I2, c) = I3
I3 = {S->c•B, B->•cB, B->•ε}
𝛿(I3, B) = I5; 𝛿(I3, ε) = I6; 𝛿(I3, c) = I7;
I4 = {S->aS•b}
𝛿(I4, b) = I8;
I5 = {S->cB•}
I6 = {B->ε•}
I7 = {B->c•B, B->•cB, B->•ε}
𝛿(I7, B) = I9; 𝛿(I7, ε) = I6; 𝛿(I7, c) = I7;
I8 = {S->aSb•}
I9 = {B->cB•}

这里有 LR(0) 自动机:

自动机图片

在那之后,我做了解析器表(但我认为不需要它来回答我的问题)所以我有一个疑问:epsilon 转换是否以正确的方式处理? 我的意思是,我将其视为正常字符,因为我们必须在某些时候减少规则编号 4。 如果我错了,我应该如何对待这种转变? 提前致谢,希望这对其他人也有帮助。

不,没有必要创建状态 I6

Y->Ɛ可能出现混淆。 当您在增广产生式中放置一个点时,例如S->AB这意味着A已完成而B尚未完成(此处的完成表示解析进度)。 同样,如果你写Y->.Ɛ ,这意味着Ɛ还没有结束,但我们也知道Ɛnull string即什么都没有,因此Y->.Ɛ被解释为Y->.

您可以使用JFLAP 软件并查看有关 SLR(1)文档

不需要......即使我在删除以下语法的左递归时也遇到了同样的问题

E->E+T|ET|T转换后的规则看起来像E->TX X->+TX|-TX|*e*

没关系

x->。 e和 x-> e 没有意义。因为移动厄普西隆前后的时期是疯子的工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM