据我了解,如果输入流中出现错误,FOLLOW-Set 会在第一时间告诉我。是对的吗?
因为否则我想知道你真正需要它做什么。考虑到您的解析器在堆栈顶部有一个非终端(在我们的类(class)中,我们使用堆栈作为 LL-Parsers 的抽象)
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/