如何处理解释器中的报告错误?

How to approach reporting errors in an interpreter?

出于学习目的,我正在用 C++ 编写算术方程式解释器。当用户输入不正确的输入时,我希望出现这样的内容:(> 是用户输入)

> 4+2*6+#-1
Lexer error: incorrect character '#' at position 7

解决这个问题的最佳方法是什么?我应该使用例外,如果是,那么我应该创建自己的例外还是只使用类似 std::runtime_error?

的东西

诀窍是在所有编译过程中始终维护源位置数据。这样你就可以举报

  • 语法错误,这是最微不足道的,在这个阶段,您手头有所有源位置数据,以及(取决于您使用的解析技术)提示您想要什么而不是在这一点上期待。只需很少的提示就可以自动推断出很多此类报告。

  • 编译期间的语义错误:对于这些,您需要保留 IR 节点的源位置。例如,对于二进制算术运算,您将拥有运算符本身的位置,子节点将能够向您显示左侧和右侧的位置。您可以在这里携带多少信息没有限制。例如,对于任何完全解析的标识符,您可能希望附加一个声明它的位置,以及迄今为止引用它的所有位置。

  • 运行时错误:这些很棘手,您在这个阶段没有丰富的 IR,但您可以发出调试数据,例如 DWARF 格式,并将其展开回源需要时的位置。

运行时错误应该由您的系统调试器处理,因此,这里没有例外。在大多数情况下,语义错误和语法错误是可以恢复的,并且您可能希望显示多个错误,因此,再一次强调,没有理由使用异常。