问题描述
在 DMD 源中,tryMain
函数在 AST 上运行多次优化。我想要做的是获取 AST,手动运行传递并检查模块 AST。是否只是破解了 tryMain
函数,或者在 DMD 中是否有一些专门用于此目的的钩子?我想保留所有预先完成的命令行处理,然后获取 AST。我不反对 DMD 继续其愉快的方式做它的事情,只要我能事先得到 AST 来检查它。
解决方法
您可以获取 AST,在 forum.dlang.org、Discord (https://discord.gg/bMZk9Q4) 或 IRC (irc://irc.freenode.net/d) 中提出此问题,您将在分钟
,TL;DR
如果您想弄清楚编译器在做什么,那么您可能需要将一些代码注入您要检查的 dmd 部分。
dmd 编译器(如果根本没有设计)在编写时并未考虑基于传递的架构,超出了语义 1/2/3 的一些极其模糊的概念,因此您可能需要在这里谨慎行事。
如果您只想使用 AST,编译器即库功能就足够了,您可以以 ASTBase
形式(即只是语法)或毕竟语义获得此 AST已进行分析和降低。
实践
例如,对于指针生命周期检查器的当前实现,本身没有“指针分析”传递,而是隐藏在实现 Semantic3 的访问者中的函数调用。
// Do live analysis
if (global.params.useDIP1021 && funcdecl.fbody && funcdecl.type.ty != Terror &&
funcdecl.type.isTypeFunction().islive)
{
oblive(funcdecl)
}
分布语义分析的池塘中奇怪的函数不是编译器的基础......