代码之家  ›  专栏  ›  技术社区  ›  rybosome

如何处理递归下降解析器中无法中断语法错误的问题

  •  0
  • rybosome  · 技术社区  · 16 年前

    我现在在一个关于系统软件开发的班上。我们正在为虚拟机的汇编语言编写双通道汇编程序。我们已经实现了记号赋予器,并且我们需要抽象地表示这个程序的所有类——剩下的(除了在后面的阶段实现代码生成器)就是解析记号。这就是我的主要问题所在。我选择将其作为递归下降解析器来实现,因为这是我目前唯一有经验的技术……但是我们不允许在语法错误时停止汇编。例如,如果用户给出了一个语法无效的加载字指令,我们将用一个nop替换它。如果用户给出了一个错误的标签,我们只需忽略它。如果用户在一行中放置未知字符,我们将丢弃它们。

    一方面,这听起来很简单——但是,实现这一点会使我打破(我理解为)递归下降解析器的重要规则之一。我的每个函数在调用另一个函数之前都会提取多个标记,因为我需要考虑所有可能的可修复语法错误。考虑到我无法停止组装,而且我必须有足够的关于当前上下文的信息,才能智能地确定用户打算做什么,所以我必须在一个函数中处理很多内容。

    这将程序从一个真正的递归下降解析器变成一个半有限状态机。我觉得我做得很糟糕,但我不知道该如何实施。有人有什么建议/想法吗?

    顺便说一句,我不允许使用诸如antlr之类的工具或任何其他解析器生成器。

    谢谢。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Stephen C    16 年前

    我的建议是不要尝试。递归下降解析器固有的语法错误恢复能力差。如果不允许使用解析器生成器,那么语法错误恢复可能超出了您的作业范围。(和你的老师核实一下…)

    推荐文章