#表达式解析器 #解析器 #逻辑 #AST解析器 #JSON输入 #语法树 #语法错误

logic-parser

支持输出为AST、JSON和SVG的简单词法分析和解析器

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次

MIT OR GPL-2.0-or-later

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()

Resulting tree

测试

为库的所有相关部分编写了单元测试。

cargo test

参考资料

依赖

~0.3–1MB
~22K SLoC