12 个版本 (破坏性更新)

0.9.0 2024年7月10日
0.8.0 2023年10月17日
0.7.0 2023年10月16日
0.6.2 2023年7月30日
0.0.1 2014年11月13日

28解析工具

Download history 67/week @ 2024-04-29 77/week @ 2024-05-06 90/week @ 2024-05-13 97/week @ 2024-05-20 85/week @ 2024-05-27 106/week @ 2024-06-03 99/week @ 2024-06-10 73/week @ 2024-06-17 92/week @ 2024-06-24 74/week @ 2024-07-01 213/week @ 2024-07-08 123/week @ 2024-07-15 51/week @ 2024-07-22 117/week @ 2024-07-29 71/week @ 2024-08-05 78/week @ 2024-08-12

每月329 次下载
11 个crate(9个直接)中使用

Apache-2.0 OR MIT

165KB
4K SLoC

cfg

上下文无关语法工具。

crates.io Documentation Rust CI MSRV

Dependency Status Download Status

Rust 库用于操作上下文无关语法。 您可以在此处查看文档.

用法

将其添加到您的 Cargo.toml

[dependencies]
cfg = "0.9"

如果您想要与 miniserde 一起使用语法序列化支持,请包含以下功能

[dependencies]
cfg = { version = "0.9", features = ["serialize"] }

如果您想要加权生成支持,请包含以下功能

[dependencies]
cfg = { version = "0.9", features = ["weighted-generation"] }

如果您想要 LL(1) 分类支持,请包含以下功能

[dependencies]
cfg = { version = "0.9", features = ["ll"] }

分析和修改语法

以下功能已实现

  • 丰富的规则构建
    • 序列规则,
    • 优先级规则。
  • 转换为类似于Chomsky规范形式的结构
    • 语法二值化,
    • 二值化语法的空规则消除。
  • 合理性
    • 循环检测和消除,
    • 无用规则检测和消除,
    • 未使用符号的删除。
  • LR(1),LL(1)和其他的分析
    • FIRST和FOLLOW集合计算,
    • 最小距离计算,
    • LL(1)分类。
  • 概率语法的工具
    • PCFGs + 负零宽前瞻的生成。

构建语法

cfg 包含了一个简化语法构建的接口。

生成符号

生成符号的最简单方法是使用 sym 方法。库不了解起始符号。

let mut grammar: Cfg = Cfg::new();
let (start, expr, identifier, number,
     plus, multiply, power, l_paren, r_paren, digit) = grammar.sym();

构建语法规则

规则具有LHS符号和零个或多个RHS符号。

示例 BNF

start ::= expr | identifier l_paren expr r_paren

使用我们的库

grammar.rule(start).rhs([expr])
                   .rhs([identifier, l_paren, expr, r_paren]);

构建序列规则

序列规则具有LHS符号、RHS符号、重复次数范围和可选分隔符。除了分隔符之外,它们与正则表达式重复相似。

示例 BNF

number ::= digit+

使用我们的库

SequencesToProductions::new(&mut grammar).sequence(number).inclusive(1, None).rhs(digit);

构建优先级规则

优先级规则是描述运算符的最便捷方式。构建后,它们立即重写为基本语法规则,并生成唯一符号。运算符的结合性可以设置为 RightGroup。默认为 Left

use cfg::precedence::Associativity::{Right, Group};

grammar.precedenced_rule(expr)
           .rhs([number])
           .rhs([identifier])
           .associativity(Group)
           .rhs([l_paren, expr, r_paren])
       .lower_precedence()
           .associativity(Right)
           .rhs([expr, power, expr])
       .lower_precedence()
           .rhs([expr, multiply, expr])
       .lower_precedence()
           .rhs([expr, plus, expr]);

使用自定义语法表示

您的语法类型必须实现 RuleContainer 特性。

许可证

双许可,以与Rust项目兼容。

根据Apache许可证第2版授权:[http://apache.ac.cn/licenses/LICENSE-2.0](http://apache.ac.cn/licenses/LICENSE-2.0),或MIT许可证:[http://opensource.org/licenses/MIT](http://opensource.org/licenses/MIT),任选其一。

依赖项

~125–480KB