2

我正在为我正在学习的编译器设计课程编写编译器,我目前正在语法分析中,我需要编写一个解析器。

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

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

任何意见将是有益的

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

4

1 回答 1

2

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

然后,您的错误恢复例程可以使用上一个或更可能的“下一个”输入令牌(即导致您报告错误的那个)来决定您可以插入输入流中的内容。

我实际上不存储这些。我使用 GLR 解析器,它的解析表本质上是 LALR 解析表,并简单地构建一个递归算法来爬取这些表以查看哪些令牌可能允许解析器继续进行。间接地,我利用了 FIRST 和 FOLLOW,因为它们用于构建解析表。

如果您正在学习编译器设计课程,我建议您关注解析后的问题。您可以花费大量时间来尝试“修补”源以响应错误,而您将学到的只是 a) 这很难,并且 b) 没有人会特别喜欢您提供的选择。您可以将精力花在语法修复上,直到脸色发青,但我会等到有人要求您为工作做这件事。同时,对于一个编译器类,我会让我的编译器简单地说,“第 N 行的语法错误”并中止。很糟糕,但足以让你继续更有趣的部分。

于 2012-03-17T20:41:18.170 回答