问题描述
出于学习目的,我正在用 C++ 编写算术方程的解释器。当用户输入不正确的输入时,我希望出现这样的内容:(> 是用户输入)
> 4+2*6+#-1
Lexer error: incorrect character '#' at position 7
解决这个问题的最佳方法是什么?我应该使用异常,如果是,那么我应该创建自己的异常还是只使用类似 std::runtime_error
的东西?
解决方法
诀窍是在所有编译过程中一直维护源位置数据。这样你就可以举报了
-
语法错误,这是最微不足道的,在此阶段您可以方便地获取所有源位置数据,以及(取决于您使用的解析技术)提示您希望对此做什么点代替。很多这样的报告可以在很少提示的情况下自动推断出来。
-
编译期间的语义错误:对于这些,您需要保留 IR 节点的源位置。例如,对于二元算术运算,您将拥有运算符本身的位置,并且子节点将能够向您显示左侧和右侧的位置。您可以在此处携带多少信息没有限制。例如,对于任何完全解析的标识符,您可能希望附加一个声明它的位置,以及迄今为止引用它的所有位置。
-
运行时错误:这些很棘手,在此阶段您没有丰富的 IR,但您可以以 DWARF 格式等方式发出调试数据,并在需要时将其展开回源位置。
运行时错误应该由您的系统调试器处理,因此,这里没有例外。语义错误和语法错误在大多数情况下是可以恢复的,而且您可能希望显示多个,因此再次强调,没有理由使用异常。