[英]SLR(1) parser with epsilon
假设我有以下语法:
E --> 发送
T --> (E) | 整数
X --> + E | ε
Y --> * T | ε
构建项目集我得到这样的状态:
T --> 整数。 是
是 --> 。 * T
是 --> 。
这种状态是否足够? 也就是说,语法是不是 SLR(1)? 谢谢
是的,您在状态中指定的条目绝对正确。
T->int.Y
Y->.*T
Y->.
这是为给定语法的 SLR(1) 解析器创建的 DFA 中的第 5 个状态。
在Y->Ɛ
可能出现混淆。 当您在增广产生式中放置一个点时,例如S->AB
这意味着 A 已完成而 B 尚未完成(此处的完成表示解析进度)。 同样,如果你写Y->.Ɛ
,这意味着 Ɛ 还没有结束,但我们也知道 Ɛ 是空字符串,即什么都没有,因此Y->.Ɛ
被解释为Y->.
我为这个语法创建了 DFA(13 个状态),发现给定的语法是 SLR(1),因为没有 Reduce-Reduce 或 Shift-Reduce 冲突。
您必须构造 FOLLOW 集并查看 FOLLOW(Y) 是否包含 int 或 *。 如果是这种情况,则会出现 shift/reduce 冲突,并且语法不会是 SLR(1)。 检查所有状态,如果没有冲突,则语法为 SLR(1)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.