LL-1解析器:FOLLOW-Set真的有必要吗?

时间:2014-01-18 17:59:20

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

据我所知,如果输入流中有错误,FOLLOW-Set会在第一时间告诉我。是吗?

因为否则我想知道你真正需要它的是什么。考虑到你的解析器在堆栈顶部有一个非终端(在我们的类中,我们使用堆栈作为LL-Parsers的抽象)

[TOP]   X...[BOTTOM]

X - 让它成为非终端 - 将在下一步中被替换,因为它位于堆栈的顶部。因此,解析器会向解析表询问用于X的派生。考虑输入是

+ b

+b都是终端。

假设X在其FIRST集中有"",即空字符串。并且在他的第一集中没有+

就我在这种情况下看到的情况而言,解析器可以简单地检查第一组X中没有+,然后使用导数让X溶解成""即空字符串,因为它是解析器可能继续解析输入而不抛出错误的唯一方法。如果输入流无效,则解析器将在稍后的某个时刻识别它。我知道FOLLOW集可以帮助确定解析是否可以继续而不会出错。

我的问题是 - 这真的是FOLLOW套装扮演的唯一角色吗?

我希望我的问题属于这里 - 如果不是,我很抱歉。如果不清楚,也可以随时要求澄清。

提前谢谢

1 个答案:

答案 0 :(得分:1)

你是对的。解析器最终可能只是继续解析,最终会以另一种方式发现冲突。 除此之外,FOLLOW集在推理语法方面非常方便。不是由解析器,而是由构造语法的人。例如,如果您发现存在任何FIRST / FIRST或FIRST / FOLLOW冲突,则您的语法模糊不清,可能需要修改它。