如何处理无法在递归下降解析器中打破语法错误

时间:2010-10-16 04:22:21

标签: java recursive-descent

我目前正在进行系统软件开发课程。我们正在为虚构机器的汇编语言编写双程汇编程序。我们已经实现了标记化器,并且我们需要抽象地表示这个程序的所有类 - 所有剩下的(除了在后面的阶段实现代码生成器之外)是解析标记。这是我遇到重大问题的地方。我选择将其实现为递归下降解析器,因为这是我目前唯一经验的技术......但我们不允许在语法错误上停止汇编。例如,如果用户给出带有无效语法的加载字指令,我们将用NOP替换它。如果用户给出了不好的标签,我们就会忽略它。如果用户将未知字符放在一行中,我们会丢弃它们。

一方面,这听起来很容易 - 但是,实现这一点会导致我破坏(我理解为)递归下降解析器的重要规则之一。我的每个函数在调用另一个函数之前会拉出多个标记,因为我需要考虑所有可能的可修复语法错误。鉴于我无法停止汇编,并且我必须有足够的关于我当前上下文的信息来智能地确定用户想要做什么,我必须在一个函数中处理很多。

这将程序从真正的递归下降解析器转变为更多的半有限状态机。我觉得我这样做很糟糕,但我不确定如何实现这一点。有没有人有任何建议/想法?

BTW - 我不允许使用ANTLR或任何其他解析器生成器等工具。

感谢。

1 个答案:

答案 0 :(得分:1)

我的建议是不要试试。语法错误恢复不良是递归下降解析器所固有的。如果不允许使用解析器生成器,那么正常的语法错误恢复可能超出了您的作业范围。 (请咨询教师......)