Parsing 带epsilon的SLR(1)解析器
假设我有以下语法: E-->发送 T-->(E)| int Y X-->+E|ε Y-->*T|ε 构建项目集时,我会得到如下状态: T-->整数。Y Y-->*T Y-->。 这种状态是否足够?也就是说,语法是否为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->
谢谢您必须构造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冲突