我正在编写一个静态分析器,包括一个特定语言程序的前端。
前端成功从程序生成AST,分析器在该程序上运行良好:它可以证明程序正确(对于某些特定属性),或者为语句或表达式引发错误。
如果出现错误,我想将错误消息显式化。因此,我想在源代码中为语句或引发错误的表达式添加精确的localisation
。显示line number
已经很好,显示row number
会更好......
有谁能告诉我如何修改前端来做到这一点?还是有任何我可以研究的文件?
(我想首先我需要修改AST中的类型,但是我必须向所有内容添加loc
吗?)
答案 0 :(得分:2)
从概念上(以及我的实现偏好)是将源代码位置(行,列,文件)添加到每个 AST节点。
这在节点中从技术上讲不应该很难,并且您可以在词法分析器中收集该信息,以便解析器处理的词汇携带该信息。让解析器将该信息复制到解析树节点应该很容易。我们已经为我们的程序分析工具做了这个,并且它运行得很好。
你会发现让行号正确是令人讨厌的,因为人们使用不一致的行尾约定(0X0D,0X0A,Unicode NEL,Unicode换行符......)。并且,您可能会发现您的行编号约定必须遵循您未编写的工具。 (海湾合作委员会对于行号增加的内容有自己的想法)。