据我了解,如果输入流中出现错误,FOLLOW-Set 会在第一时间告诉我。那正确吗?
因为否则我想知道你真正需要它做什么。考虑到您的解析器在堆栈顶部有一个非终端(在我们的类(class)中,我们使用堆栈作为 LL 解析器的抽象)
IE。
[TOP] X...[BOTTOM]
X - 让它成为一个非终端 - 将在下一步中被替换,因为它位于堆栈的顶部。因此解析器询问解析表对 X 使用什么派生。考虑输入是
+ b
哪里
+
和 b
都是终端。假设 X 有
""
即第一组中的空字符串。它没有 +
在他的第一组。据我在这种情况下看到的,解析器可以简单地检查是否没有
+
在第一组 X 中,然后使用使 X 分解为 ""
的推导即空字符串,因为它是解析器如何继续解析输入而不抛出错误的唯一方法。如果输入流无效,解析器无论如何都会在稍后的某个时刻识别它。我知道 FOLLOW 集可以帮助立即确定解析是否可以继续而不会出错。我的问题是 - 这真的是 FOLLOW 集扮演的唯一角色吗?
我希望我的问题属于这里 - 如果不是,我很抱歉。如果有不清楚的地方,也可以随时要求澄清。
先感谢您
最佳答案
你是对的。解析器最终可以继续解析并最终以另一种方式发现冲突。
除此之外,FOLLOW 集在推理语法时非常方便。不是由解析器,而是由构建语法的人。例如,如果您发现存在任何 FIRST/FIRST 或 FIRST/FOLLOW 冲突,则您创建了一个歧义的语法,并且可能想要修改它。
关于parsing - LL-1 解析器 : Is the FOLLOW-Set really necessary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21207772/