C# 如何访问Q#编译器生成的AST?

C# 如何访问Q#编译器生成的AST?,c#,abstract-syntax-tree,quantum-computing,q#,C#,Abstract Syntax Tree,Quantum Computing,Q#,背景 我正在从事的项目的一部分要求我分析Q#源代码,并在遇到某些语法元素时执行特定操作。例如,假设我想计算在整个程序中使用了多少种不同的门类型。现在,这可以通过遍历程序的抽象语法树并基于当前语法节点执行操作来实现 我尝试过的 我从分析存储库开始,但是,编译器的内部工作缺乏在线文档,浏览所有C和F源代码可能非常乏味 当然,我可以为该语言编写自己的解析器,但对于手头的任务来说,这可能是一种过分的做法。必须有一种方法从编译器内部提取AST 问题 有没有一种方法可以通过编程方式(从C或F)使用Q编译器编

背景

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

我尝试过的

我从分析存储库开始,但是,编译器的内部工作缺乏在线文档,浏览所有C和F源代码可能非常乏味

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

问题


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

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

但是,如果您只想处理AST以进行Q编译,那么有一种更简单的方法!Q#编译器有一个扩展机制,我相信它非常适合您的需要。 本文简要概述了该功能。 在编译器repo上还有一个扩展名。这(可能)也会派上用场。我相信这回答了你一半的问题,即如何轻松访问已构建的AST

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

与其先看转换的定义,不如只看一些使用转换的示例更直观。你可以找到一个非常接近你想要做的例子。实现的转换向每个可调用项添加注释,列出可调用项中使用的所有标识符。它作为编译步骤的一部分被调用(请参阅),编译步骤在我上面链接的示例中定义

还有几个简单转换的好例子,它们与您想要做的有点远,但如果您感兴趣,应该可以让您了解整个设置是如何工作的:允许将属性附加到可调用项,并用于内联共轭(U*VU形式的模式)


最后但并非最不重要的一点是,for在您工作时也可能是一个很好的资源。

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

但是,如果您只想处理AST以进行Q编译,那么有一种更简单的方法!Q#编译器有一个扩展机制,我相信它非常适合您的需要。 本文简要概述了该功能。 在编译器repo上还有一个扩展名。这(可能)也会派上用场。我相信这回答了你一半的问题,即如何轻松访问已构建的AST

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

与其先看转换的定义,不如只看一些使用转换的示例更直观。你可以找到一个非常接近你想要做的例子。实现的转换向每个可调用项添加注释,列出可调用项中使用的所有标识符。它作为编译步骤的一部分被调用(请参阅),编译步骤在我上面链接的示例中定义

还有几个简单转换的好例子,它们与您想要做的有点远,但如果您感兴趣,应该可以让您了解整个设置是如何工作的:允许将属性附加到可调用项,并用于内联共轭(U*VU形式的模式)

最后但并非最不重要的一点是,在您工作时,for也可能是一个很好的资源