我现在在一个关于系统软件开发的班上。我们正在为虚拟机的汇编语言编写双通道汇编程序。我们已经实现了记号赋予器,并且我们需要抽象地表示这个程序的所有类——剩下的(除了在后面的阶段实现代码生成器)就是解析记号。这就是我的主要问题所在。我选择将其作为递归下降解析器来实现,因为这是我目前唯一有经验的技术……但是我们不允许在语法错误时停止汇编。例如,如果用户给出了一个语法无效的加载字指令,我们将用一个nop替换它。如果用户给出了一个错误的标签,我们只需忽略它。如果用户在一行中放置未知字符,我们将丢弃它们。
一方面,这听起来很简单——但是,实现这一点会使我打破(我理解为)递归下降解析器的重要规则之一。我的每个函数在调用另一个函数之前都会提取多个标记,因为我需要考虑所有可能的可修复语法错误。考虑到我无法停止组装,而且我必须有足够的关于当前上下文的信息,才能智能地确定用户打算做什么,所以我必须在一个函数中处理很多内容。
这将程序从一个真正的递归下降解析器变成一个半有限状态机。我觉得我做得很糟糕,但我不知道该如何实施。有人有什么建议/想法吗?
顺便说一句,我不允许使用诸如antlr之类的工具或任何其他解析器生成器。
谢谢。