parsing - LL-1 解析器 : Is the FOLLOW-Set really necessary?

标签 parsing compiler-construction grammar context-free-grammar ll

据我了解,如果输入流中出现错误,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/

相关文章:

ios - 在 Swift Issue 中解析 iOS 应用程序的 JSON

c - 读取C中的汇编文件

c# - 替换时忽略特定出现的字符串

c++ - 在旧版本的 linux 上运行我的代码

swift - 如何编译/调度 swift 上的全局函数?

c# - 计算类计数的部分语法

Java/解析对象并将其字段加载到 JTree 中

java - Gradle:从命令行将参数传递给编译器

python - 改变 Python 的语法

grammar - 构造生成 L = {a^p b^m c^n|n>=0, m>=0, p=m+n} 的文法