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 在 解析工具
每月329 次下载
在 11 个crate(9个直接)中使用
165KB
4K SLoC
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);
构建优先级规则
优先级规则是描述运算符的最便捷方式。构建后,它们立即重写为基本语法规则,并生成唯一符号。运算符的结合性可以设置为 Right
或 Group
。默认为 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