【问题标题】:How to access the AST generated by the Q# compiler?如何访问 Q# 编译器生成的 AST?
【发布时间】:2020-10-25 22:35:21
【问题描述】:

背景

我正在进行的部分项目要求我分析 Q# 源代码并在遇到某些语法元素时执行特定操作。例如,假设我想计算整个程序中使用了多少种不同的门类型。现在,这可以通过遍历程序的抽象语法树并根据当前语法节点执行操作来实现。

我的尝试

我从分析 qsharp-compiler 存储库开始,但是,编译器的内部工作缺乏在线文档,浏览所有 C# 和 F# 源代码确实很乏味。

当然,我可以为该语言编写自己的解析器,但这对于手头的任务来说可能有点过头了。 必须有一种方法可以从编译器内部提取 AST。

问题

有没有办法使用 Q# 编译器以编程方式(从 C# 或 F#)编译 Q# 源代码,并提取内部 AST?

【问题讨论】:

    标签: c# abstract-syntax-tree quantum-computing q#


    【解决方案1】:

    是的,完全可以以编程方式编译 Q# 源代码。如果您想重复更新编译,这特别有用 - 您可以在内存中添加/删除/编辑(部分)源和引用,并查询有关编译当前状态的各种有用信息,例如IDE 关心(例如,在某个文件的特定位置定义了哪些符号)。

    但是,如果您只想处理 AST 以进行 Q# 编译,那么还有一种更简单的方法! Q# 编译器有一个可扩展机制,我相信它完全符合您的需要。 blog post 简要概述了该功能。 还有一个 example 用于编译器存储库的扩展。这个readme(可能还有this one)也可能派上用场。我相信这回答了您的一半问题,即如何轻松访问已构建的 AST。

    根据我的解释,另一半问题是如何方便地分析或转换 AST。为此,还提供了一种机制;语法树转换框架。该框架由几个类组成,这些类定义了不同类型节点的遍历/转换,以及一个将它们全部组合在一起的包装类。

    与其从查看转换的定义开始,不如只看一些使用它的示例可能更直观。可以在here 找到一个与您想要做的非常接近的示例。实现的转换向每个可调用对象添加注释,列出可调用对象中使用的所有标识符。它作为编译步骤的一部分被调用(参见here),该步骤在我上面已经链接的示例中定义。

    还有一些其他很好的简单转换示例,它们与您想要做的有点远,但如果您有兴趣,应该让您了解整个设置是如何工作的:this one 允许将属性附加到可调用对象,this one 用于内联共轭(U*VU 形式的模式)。

    最后但并非最不重要的一点是,Q# communityGitter 也可能是您在工作时参与的好资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2017-05-31
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      相关资源
      最近更新 更多