#qasm #front-end #openqasm3 #parser

oq3_lexer

OpenQASM 3解析器/分析器的词法分析器

13个版本 (6个破坏性版本)

0.6.0 2024年5月3日
0.5.0 2024年3月26日
0.4.0 2024年3月1日
0.3.0 2024年3月1日
0.0.7 2024年1月31日

#777解析器实现

Download history 1421/week @ 2024-04-23 2818/week @ 2024-04-30 2051/week @ 2024-05-07 1981/week @ 2024-05-14 883/week @ 2024-05-21 1380/week @ 2024-05-28 2187/week @ 2024-06-04 1756/week @ 2024-06-11 2154/week @ 2024-06-18 2789/week @ 2024-06-25 2965/week @ 2024-07-02 1867/week @ 2024-07-09 1870/week @ 2024-07-16 2890/week @ 2024-07-23 2910/week @ 2024-07-30 2493/week @ 2024-08-06

10,332 每月下载量
用于 4 个crate(3 个直接使用)

Apache-2.0

69KB
1.5K SLoC

OpenQASM 3解析器

License Minimum rustc 1.70 oq3_semantics crate

本项目为OpenQASM 3语言(OQ3)提供编译器前端。

在此文档中,此解析器被称为openqasm3_parser

为什么这很重要?

人们对于使用OpenQASM 3有很高的兴趣。例如,用于控制硬件和作为量子电路的交换介质。本项目旨在为编译器和导入器提供一个性能优良、健壮的前端。目前没有其他类似的开源(或公开)项目。

OpenQASM参考解析器的不同之处包括

  • openqasm3_parser中的解析器性能更优。对大型源文件的粗略测试显示解析时间减少了80倍。
  • openqasm3_parser执行语义分析。特别是诊断和错误报告更好。

贡献

如果您有兴趣贡献,查看问题是一个好开始。其中一些问题被标记为“Looking for assignee”。带有此标签的问题比其他一些问题提供了更多的上下文,以引导新来的贡献者。此外,核心开发者并不打算在近期内解决这些问题。然而,这并不意味着如果您认为更适合,您不能处理没有此标签的问题。

CONTRIBUTING.md中有更多提示,以及一些在README文件中的后续内容。

Crates(每个crate大约是一个可安装的库)

前三个crate基于rustrust-analyzer的工具。

  • oq3_lexer -- 对rustc(rust编译器)词法分析器进行轻微修改的版本。
  • oq3_parser -- 消费oq3_lexer的输出,并输出具体语法树。
  • oq3_syntax -- 从 oq3_parser 的输出中获取数据并输出一个抽象语法树(AST)。rust-analyzer 的文档有时会通过“类型化 AST”这样的名称来指代这个 AST,这可能会造成混淆。这并不意味着已经完成了语义分析,并且 OQ3 类型已经分配给了所有表达式。这表示使用 Rust 类型系统来编码语法元素,与同一仓库中某些较低级别的表示不同。
  • oq3_semantics -- 执行语义分析并输出一个抽象语义图(ASG)。这个结构有其他名称,但“ASG”更方便。
  • oq3_source_file -- 到语法 AST 的高级接口。它位于语法 AST 和语义 ASG 之间。这个仓库管理主要的源文件和包含的源文件。
Rust 的 "crate" 是什么?

我们谈论 Rust 的"crate"(包)。Rust 库 crate 大约是 Rust 库的源代码,它通过 Rust 包管理器 cargo 进行开发、构建和安装。这个单一仓库包含多个可以单独安装的 crate。将来,这个仓库也可能用于生成其他工件。

警告!

不要运行 cargo test。而是使用 ./run_tests.sh 或其中找到的命令。这是因为代码生成是通过测试系统实现的(你读对了)。如果可能,我们计划将其更改为更传统的做法。

使用这个前端

提醒:前端如果没有后端就没有太多用处。如何使用入口点和它们的示例可以在 ./crates/oq3_semantics/examples/semdemo.rs 中找到。

shell> export QASM3_PATH=./crates/semantics/examples/qasm/
shell> cargo run --example semdemo -- semantic scratch1.qasm

scratch1.qasm 替换为在 ./crates/oq3_semantics/examples/qasm/ 中找到的某个文件。

搜索路径

环境变量 QASM_PATH 是由冒号分隔的路径列表。请注意,名称遵循古老的 Unix 传统,以 PATH 结尾而不是 PATHS。检索路径的代码使用了 std::path 例程,它实际上可以处理其他平台上的路径规范。

设计

解析的底层代码已经借用并修改了 rust-analyzer 的代码。rust-analyzer 的开发者文档与结构适应 OQ3 时的结构变化非常相关。

备注

部分代码修改自rust-analyzer中的代码。它是在此提交中获取的。

commit d398ad3326780598bbf1480014f4c59fbf6461a7
Merge: 2f2cf21da 6990d0f26
Author: bors <[email protected]>
Date:   Wed Aug 2 14:28:41 2023 +0000

    Auto merge of #15380 - HKalbasi:mir, r=HKalbasi

    Fix unsized struct problems in mir eval

依赖项

~345KB