如何解决通过合适的例子了解预测解析中错误恢复恐慌模式的启发式
我正在阅读Ullman等人撰写的编译器:原理、技术和工具文本。 al 我在预测解析中遇到了恐慌模式恢复的概念。文本说明了一些应该遵循的启发式方法。但是他们在文中后面给出的例子只说明了启发式的 (1)
和 (5)
点。
恐慌模式错误恢复基于跳过输入上的符号的想法,直到出现一组选定的同步标记中的标记。其有效性取决于同步集的选择。应该选择这些集合,以便解析器从实践中可能发生的错误中快速恢复。
一些启发式如下:
-
作为起点,我们可以将
FOLLOW(A)
中的所有符号放入非终结符A
的同步集中。如果我们跳过标记直到看到FOLLOW(A)
的元素并从堆栈中弹出A
,解析很可能会继续。 -
使用
FOLLOW(A)
作为A
的同步集是不够的。例如,如果分号终止语句,如在C
中,那么开始语句的关键字可能不会出现在非终结符生成表达式的FOLLOW
集中。因此,赋值后缺少分号可能会导致跳过下一条语句开始的关键字。通常,语言中的构造具有层次结构;例如,表达式出现在语句中,出现在块中,等等。我们可以将开始较高结构的符号添加到较低结构的同步集合中。例如,我们可以将开始语句的关键字添加到非终结符生成表达式的同步集中。 -
如果我们将
FirsT(A)
中的符号添加到非终结符A
的同步集中,那么如果A
中的符号存在,则可以根据FirsT(A)
继续解析}} 出现在输入中。 -
如果非终结符可以生成空字符串,那么可以使用派生式
\epsilon
作为默认值。这样做可能会推迟某些错误检测,但不会导致错过错误。这种方法减少了在错误恢复期间必须考虑的非终结符的数量。 -
如果栈顶的终端无法匹配,一个简单的想法是弹出终端,发出一条消息说终端被插入,然后继续解析。实际上,这种方法使令牌的同步集包含所有其他令牌。
总的来说,我无法理解第 (4)
点中所述启发式的含义。
谁能给我一个示例(或多个示例),其中点 (2),(3),(4)
可能有用。虽然我可以理解除(4)
之外的所有点的含义,但由于书中没有说明点(2),(3)和(4),一个例子可以帮助我更好地理解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。