0

I'm working on a DSL compiler and want to provide more friendly information for user. So I remember that those mature compilers like GCC or GHC all can point out what semantics error happened in which lines, and they even can strip them from generated codes.

The first idea is to add linenumbers in my AST while parsing. But I'm not sure if this is a standard solution, or there're other better ways to do that ? I doubt it because this solution ask every nodes in the AST to bring extra data, and they may become burden.

4

2 回答 2

1

好吧,如您所知,词法分析器是谁知道行号,然后,对于未知标记和语法错误,您可以毫无问题地获得行号。但是,出于调试目的,您必须生成调试信息并将其存储在某个地方(例如,在 .Net 中,您有两个不同的文件:编译文件和调试信息文件。在 Java 中,调试信息位于同一个 .class 文件中在将指令与代码行号映射的特殊表中)。该信息由调试信息传递生成,该传递使用 AST 等。

然后,答案是肯定的,你的 AST 节点可以有一个 lineNumber 属性用于调试信息生成器/代码生成器。这在编译器和解释器中都很重要。

我已经这样做了,效果很好。

于 2013-01-20T16:04:39.457 回答
1

这些都可以指出哪些语义错误发生在哪些行

而是语法错误(好吧,有人可能会争论......)。关键是这不是调试信息。我宁愿去维护一个 lexer pass 可以用当前行号更新的解析上下文。如果您想要调试信息,那就不同了,为此您最终需要存储行号,并发出调试器输出(请注意,在调试时,例如,一个 C 程序,它是显示行信息的调试器,而不是编译器)。

于 2013-01-20T15:20:30.820 回答