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