Jak*_*kuJ 1 c# abstract-syntax-tree quantum-computing q#
背景
我正在处理的项目的一部分要求我分析 Q# 源代码并在遇到某些语法元素时执行特定操作。例如,假设我想计算整个程序中使用了多少种不同的门类型。现在,这可以通过遍历程序的抽象语法树并根据当前语法节点执行操作来实现。
我试过的
我首先分析了qsharp-compiler存储库,但是,编译器的内部工作方式缺乏在线文档,浏览所有 C# 和 F# 源代码非常乏味。
当然,我可以为该语言编写自己的解析器,但这对于手头的任务来说可能是一种矫枉过正。有有一个方法可以从编译器的内部提取AST。
问题
有没有办法以编程方式使用 Q# 编译器(从 C# 或 F#)编译 Q# 源代码,并提取内部 AST?
小智 5
是的,完全可以以编程方式编译 Q# 源代码。如果您想重复更新编译,这尤其有用 - 您可以在内存中添加/删除/编辑(部分)源和引用,并查询有关编译当前状态的各种有用信息,例如 IDE 关心的关于(例如,在某个文件的特定位置定义了哪些符号)。
但是,如果您只想为 Q# 编译处理 AST,那么还有一种更简单的方法!Q# 编译器具有可扩展性机制,我认为它非常适合您的需要。这篇博文简要概述了该功能。编译器存储库上还有一个扩展示例。这个自述文件(可能还有这个)也可能派上用场。我相信这回答了您的一半问题,即如何轻松访问构建的 AST。
根据我的解释,问题的另一半是如何方便地分析或转换 AST。为此,还提供了一种机制;语法树转换框架。该框架由几个类组成,这些类定义了不同类型节点的步行/转换,以及一个将它们连接在一起的包装类。
与其从查看转换的定义开始,不如查看一些使用它的示例可能更直观。可以在此处找到与您想要执行的操作非常接近的示例。实现的转换向每个可调用对象添加注释,列出可调用对象中使用的所有标识符。它作为编译步骤(参见此处)的一部分被调用,该步骤在我上面已经链接的示例中定义。
还有一些其他很好的简单转换示例,它们与您想要做的有点远,但是如果您感兴趣,应该可以让您了解整个设置是如何工作的:这个允许将属性附加到可调用对象,而这个一个用于内联共轭(U*VU 形式的模式)。
最后但并非最不重要的一点是,Q# 社区的Gitter也可能是您工作时参与的好资源。
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |