如何从 DMD mars.d 访问模块 AST

问题描述

在 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)
}

分布语义分析的池塘中奇怪的函数不是编译器的基础......