5个版本 (稳定)
1.3.0 | 2023年10月5日 |
---|---|
1.2.0 | 2023年10月2日 |
1.1.1 | 2023年10月2日 |
0.1.0 | 2023年10月2日 |
#1334 在 解析器实现 中
每月下载 27次
81KB
890 行
逻辑语法树生成器
Rust库,用于词法分析、解析和可视化逻辑表达式。
代码没有超过 thiserror
的相关依赖,用于改进错误处理,以及一个 可选的 serde
功能,用于从格式良好的JSON输入反序列化语法树。
解析器当前处理以下 巴科斯-诺尔范式 的单行表达式
expr := term [(<-> | ->) expr]
term := prop [(|| | &&) term]
prop := [~] ("true" | "false" | name | LPAREN expr RPAREN)
这个概念对我来说非常新颖,所以不要期望这个语法符合标准。😁 解析器目前按预期工作,报告有意义的语法错误,并解析任何复杂的表达式。
想将这个库用于Web?还编写了Web Assembly绑定!请查看(未发布)的 logic-parser-wasm
库。
示例
let expression = "((p || q)) => (q && ~(r))";
let tokens: Vec<Token> = Lexer::new().tokenize(expression)?;
let ast: ASTNode = Parser::new(&tokens).parse()?;
ast.as_json()
JSON输出
{
"type": "operator.implies",
"left": {
"type": "operator.or",
"left": {
"type": "identifier",
"name": "p"
},
"right": {
"type": "identifier",
"name": "q"
}
},
"right": {
"type": "operator.and",
"left": {
"type": "identifier",
"name": "q"
},
"right": {
"type": "operator.not",
"operand": {
"type": "identifier",
"name": "r"
}
}
}
}
渲染的SVG树
let horizontal_separation = 20_f32;
let vertical_separation = 30_f32;
let radius = 15_f32;
// ((p || q)) => (q && ~(r))
let svg = render_to_svg(
ast,
horizontal_separation,
vertical_separation,
radius
);
svg.as_xml()
测试
为库的所有相关部分编写了单元测试。
cargo test
参考资料
依赖
~0.3–1MB
~22K SLoC