Parsing 带epsilon的SLR(1)解析器

Parsing 带epsilon的SLR(1)解析器,parsing,grammar,Parsing,Grammar,假设我有以下语法: E-->发送 T-->(E)| int Y X-->+E|ε Y-->*T|ε 构建项目集时,我会得到如下状态: T-->整数。Y Y-->*T Y-->。 这种状态是否足够?也就是说,语法是否为SLR(1)? 谢谢您必须构造FOLLOW集合,并查看FOLLOW(Y)是否包含int或*。如果是这样的话,就会出现移位/减少冲突,语法就不会是单反(1)。 检查所有状态,如果没有冲突,则语法为SLR(1)。是,您在状态中指定的条目绝对正确 T->int.Y Y->

假设我有以下语法:

E-->发送

T-->(E)| int Y

X-->+E|ε

Y-->*T|ε

构建项目集时,我会得到如下状态:

T-->整数。Y

Y-->*T

Y-->。

这种状态是否足够?也就是说,语法是否为SLR(1)?
谢谢

您必须构造FOLLOW集合,并查看FOLLOW(Y)是否包含int或*。如果是这样的话,就会出现移位/减少冲突,语法就不会是单反(1)。
检查所有状态,如果没有冲突,则语法为SLR(1)。

是,您在状态中指定的条目绝对正确

  T->int.Y
  Y->.*T
  Y->.
这是为给定语法的SLR(1)解析器创建的DFA中的第5个状态

Y->Ɛ
中可能会出现混淆。当您在增强产品中放置一个点时,例如
S->a.B
,这意味着a已经完成,而B尚未完成(这里的完成意味着解析过程的进展)。类似地,如果你写
Y->。Ɛ
,这意味着Ɛ还没有结束,但我们也知道Ɛ是空字符串,即没有任何内容,因此
Y->。Ɛ
被解释为
Y->。

我为这个语法创建了DFA(13个状态),发现给定的语法是SLR(1),因为没有Reduce-Reduce或Shift-Reduce冲突