3 个版本
0.1.3 |
|
---|---|
0.1.2 | 2022年2月21日 |
0.1.1 | 2022年2月17日 |
0.1.0 | 2022年2月17日 |
#2261 in 解析器实现
260 每月下载量
155KB
3.5K SLoC
openqasm-rs
此包实现了 OpenQASM 2.0 的解析器、类型检查器和翻译器。
功能
- 在翻译前和翻译期间进行完全类型检查。
- 得益于 ariadne,提供美观的错误信息。
- 使用 pretty 进行格式化打印。
- 灵活处理包含语句以实现沙盒。
- 为了便于使用,在规范上略有放宽,例如允许门定义无序且优雅地处理包含循环。
- 无不安全代码。
未来路线图
- 支持 OpenQASM 3.0。
- 提供语法高亮和语言服务器扩展。
- 提供可视化电路的实用工具。
- 在 2.0 到 3.0 之间转译 OpenQASM,或将其转换为其他语言,如 Quil。
示例
解析文件并格式化打印
use openqasm as oq;
use oq::GenericError;
fn main() {
let mut cache = oq::SourceCache::new();
let mut parser = oq::Parser::new(&mut cache)
.with_file_policy(oq::parser::FilePolicy::Ignore);
parser.parse_file("file.qasm");
let prog = parser.done().to_errors().unwrap();
println!("{}", prog.to_pretty(70));
}
类型检查程序
use openqasm as oq;
use oq::GenericError;
fn example(path: &str, cache: &mut oq::SourceCache) -> Result<(), oq::Errors> {
let mut parser = oq::Parser::new(cache);
parser.parse_file(path);
let program = parser.done().to_errors()?;
program.type_check().to_errors()?;
Ok(())
}
fn main() {
let mut cache = oq::SourceCache::new();
if let Err(errors) = example("filename.qasm", &mut cache) {
errors.print(&mut cache).unwrap();
}
}
更多示例请参阅 examples
目录。
依赖关系
~4.5–7MB
~94K SLoC