有哪些收集和传达编译器错误的方法

时间:2011-09-30 15:09:39

标签: .net compiler-construction f# functional-programming compiler-errors

最简单的方法是在第一次出现错误时抛出包含错误信息的异常。也许另一种方法是通过分析函数传递可变列表参数。但是我注意到F#编译器会在编译过程中在Visual Studio错误窗格中逐步累积错误。使用TraceListener会是一个选项吗?不同方法的优点和缺点是什么。

我对使用像F#这样的函数式语言编写.NET的编译器的方法特别感兴趣,但是也会欣赏其他上下文中的方法(可能也可能不同)。

2 个答案:

答案 0 :(得分:3)

你可以随时查看F#编译器代码作为一个例子(虽然现实世界的代码总是有点混乱:)):

https://github.com/fsharp/fsharp/blob/master/src/fsharp/ErrorLogger.fs

我们有一个带有警告和错误“sinks”的ErrorLogger接口,以及编译器的各个部分“接收”错误并通过接口向活动记录器发出警告。

在遇到错误时决定是否应抛出(并放弃本地控制流)或记录并继续(获取更多信息但存在更多级联错误的风险)可能会很困难。有很多策略可以解决这个问题,但最终都很棘手,因为典型的工业级编译器有数千种诊断功能,人们可以编写错误代码,看似无限多种方式,并且一刀切解决方案不太可能为每个错误,甚至每个常见错误提供最佳体验。

正如有人所说,编译器通常以规范格式将输出写入stdout / stderr。 MSBuild和Visual Studio解析构建输出以点亮错误列表并在IDE UI中进行波动。对于在键入(而不是构建)时的增量反馈,VS还会在进程中“托管”编译器的前端,并直接从“接收器”中读取错误消息。

只要你至少有一个抽象边界(例如LogWarningLogError函数,它甚至可能是全局的,只要确保所有警告/错误都使用它,那么你总是能够重构以满足不断变化的需求/设计。

答案 1 :(得分:1)

我使用的任何编译器(包括.NET编译器)都会立即将错误消息输入控制台。非常重要的考虑因素是,这允许程序员键入Ctrl + C来快速结束由于声明中的错误而生成的大量错误。这些天不再是非常相关,但两者都没有不同。