如何编码FIRST& FOLLOW在编译器中设置

时间:2012-03-17 20:05:52

标签: grammar recursive-descent compiler-construction

我正在为编译器设计课程编写一个编译器,我正在进行语法分析,我需要编写一个解析器。

我需要FIRST和FOLLOW集来处理源文本中可能出现的任何错误。我已经为我的语法中的所有非终端预先计算了FIRST和FOLLOW集,但是我无法确定我应该在程序中实际编码它们的位置。

我应该将它们放在地图中,其中键是非终端的名称吗?

任何建议都会有所帮助

这篇文章可能看起来有点不清楚,如果需要,我可以澄清任何一点。

1 个答案:

答案 0 :(得分:2)

如果要保留它们,则需要将它们附加到它们所代表的非终结符上。您可能还需要一个反转,例如,从集合成员返回到非终结点的地图,它们是FIRST或FOLLOW。

然后您的错误恢复例程可以使用之前或更可能的" next"输入令牌(导致您报告错误的令牌)决定您可以插入到输入流中的内容。

我实际上并不存储这些。我使用了一个GLR解析器,它的解析表基本上是LALR解析表,只需构建一个递归算法来抓取表,看看哪些令牌可能允许解析器继续。间接地,我利用了FIRST和FOLLOW,因为那些用于构造解析表。

如果您正在参加编译器设计课程,我建议您专注于解析后问题。您可以花费大量时间来尝试修补"响应错误的来源,你所学到的只有a)这很难,b)没有人会特别喜欢你提供的选择。你可以花费精力进行语法修复,直到你脸红了,但我要等到有人要求你做一份工作。与此同时,对于编译器类,我让我的编译器简单地说," N行上的语法错误"并且中止。 很好,但足以让你继续使用更有趣的部分。