4 个版本 (稳定)
2.1.0 | 2020 年 10 月 16 日 |
---|---|
2.0.0 | 2020 年 10 月 15 日 |
1.0.0 | 2020 年 7 月 25 日 |
0.1.0 | 2020 年 7 月 17 日 |
在 解析器实现 中排名第 1760
每月下载量 51,681
在 2 crate 中使用
87KB
1.5K SLoC
souper-ir
Souper IR 的操作库。
此 crate 提供解析或生成 Souper IR 的 AST 类型。它既适合编写自定义 LHS 提取器,也适合将学习到的优化转换为您的自定义窥视优化传递。
AST
AST 类型定义和构建器位于 souper_ir::ast
模块中。
解析 Souper IR
当启用 parse
Cargo 功能时,souper_ir::parse
模块包含从文件或内存中的字符串解析 Souper IR 的函数。
use std::path::Path;
// We provide a filename to get better error messages.
let filename = Path::new("example.souper");
let replacements = souper_ir::parse::parse_replacements_str("
;; x + x --> 2 * x
%0 = var
%1 = add %0, %0
%2 = mul %0, 2
cand %1, %2
;; x & x --> x
%0 = var
%1 = and %0, %0
cand %1, %0
", Some(filename))?;
输出 Souper IR 的文本格式
当启用 stringify
Cargo 功能时,souper_ir::ast::Replacement
、souper_ir::ast::LeftHandSide
和 souper_ir::ast::RightHandSide
类型都实现了 std::fmt::Display
。 Display
实现将 AST 类型写入 Souper 的文本格式。
use souper_ir::ast;
// Build this Souper left-hand side:
//
// %x:i32 = var
// %y = mul %x, 2
// infer %y
//
// We expect that Souper would be able to synthesize a right-hand side that
// does a left shift by one instead of a multiplication.
let mut lhs = ast::LeftHandSideBuilder::default();
let x = lhs.assignment(
Some("x".into()),
Some(ast::Type { width: 32 }),
ast::AssignmentRhs::Var,
vec![],
);
let y = lhs.assignment(
Some("y".into()),
None,
ast::Instruction::Mul {
a: x.into(),
b: ast::Constant { value: 2, r#type: None }.into(),
},
vec![],
);
let lhs = lhs.finish(y, vec![]);
// Now we can stringify the LHS (and then, presumably, give it to Souper)
// with `std::fmt::Display`:
use std::io::Write;
let mut file = std::fs::File::create("my-lhs.souper")?;
write!(&mut file, "{}", lhs)?;
依赖关系
~30KB