通过合适的例子了解预测解析中错误恢复恐慌模式的启发式

如何解决通过合适的例子了解预测解析中错误恢复恐慌模式的启发式

我正在阅读Ullman等人撰写的编译器:原理、技术和工具文本。 al 我在预测解析中遇到了恐慌模式恢复的概念。文本说明了一些应该遵循的启发式方法。但是他们在文中后面给出的例子只说明了启发式的 (1)(5) 点。

恐慌模式错误恢复基于跳过输入上的符号的想法,直到出现一组选定的同步标记中的标记。其有效性取决于同步集的选择。应该选择这些集合,以便解析器从实践中可能发生的错误快速恢复。

一些启发式如下:

  1. 作为起点,我们可以将 FOLLOW(A) 中的所有符号放入非终结符 A 的同步集中。如果我们跳过标记直到看到 FOLLOW(A) 的元素并从堆栈中弹出 A,解析很可能会继续。

  2. 使用 FOLLOW(A) 作为 A 的同步集是不够的。例如,如果分号终止语句,如在 C 中,那么开始语句的关键字可能不会出现在非终结符生成表达式的 FOLLOW 集中。因此,赋值后缺少分号可能会导致跳过下一条语句开始的关键字。通常,语言中的构造具有层次结构;例如,表达式出现在语句中,出现在块中,等等。我们可以将开始较高结构的符号添加到较低结构的同步集合中。例如,我们可以将开始语句的关键字添加到非终结符生成表达式的同步集中。

  3. 如果我们将 FirsT(A) 中的符号添加到非终结符 A 的同步集中,那么如果 A 中的符号存在,则可以根据 FirsT(A) 继续解析}} 出现在输入中。

  4. 如果非终结符可以生成空字符串,那么可以使用派生式 \epsilon 作为认值。这样做可能会推迟某些错误检测,但不会导致错过错误。这种方法减少了在错误恢复期间必须考虑的非终结符的数量

  5. 如果栈顶的终端无法匹配,一个简单的想法是弹出终端,发出一条消息说终端被插入,然后继续解析。实际上,这种方法使令牌的同步集包含所有其他令牌。

总的来说,我无法理解第 (4) 点中所述启发式的含义。

谁能给我一个示例(或多个示例),其中点 (2),(3),(4) 可能有用。虽然我可以理解除(4)之外的所有点的含义,但由于书中没有说明点(2),(3)和(4),一个例子可以帮助我更好地理解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?