【问题标题】:How to access module AST from DMD mars.d如何从 DMD mars.d 访问模块 AST
【发布时间】:2021-03-30 10:08:02
【问题描述】:

在 DMD 源代码中,tryMain 函数在 AST 上运行多个优化通道。我想要做的是获取 AST,手动运行通行证并检查模块 AST。只是破解tryMain 函数还是在DMD 中有一些专门为此目的的钩子?我想保留事先完成的所有命令行处理,然后获取 AST。只要我能事先得到 AST 来检查它,我不反对 DMD 继续以它快乐的方式做事。

【问题讨论】:

  • 当所有内部讨论都在forum.dlang.org 上进行时,你为什么要在这里问这个?您可能会在 IRC 频道(FreeNode,频道#D)上得到快速回复

标签: d dmd


【解决方案1】:

您可以获取 AST,在 forum.dlang.org、Discord (https://discord.gg/bMZk9Q4) 或 IRC (irc://irc.freenode.net/d) 中提出这个问题,您将在几分钟内得到答案

【讨论】:

    【解决方案2】:

    TL;DR

    如果您想弄清楚编译器在做什么,那么您可能需要将一些代码注入您想要检查的 dmd 部分。

    除了语义 1/2/3 的一些极其模糊的概念之外,dmd 编译器(如果设计的话)没有考虑到基于传递的架构,因此您可能需要在这里小心行事。

    如果您只是想使用 AST,编译器即库功能已经足够好,您可以通过 ASTBase-form(即只是语法)或在所有语义分析之后获得此 AST已降低。

    实践

    例如,对于指针生命周期检查器的当前实现,本身没有“指针分析”传递,而是隐藏在实现 Semantic3 的访问者中的函数调用。

    // Do live analysis
    if (global.params.useDIP1021 && funcdecl.fbody && funcdecl.type.ty != Terror &&
        funcdecl.type.isTypeFunction().islive)
    {
        oblive(funcdecl)
    }
    

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

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2020-11-06
      • 1970-01-01
      • 2015-12-18
      • 2011-08-29
      相关资源
      最近更新 更多