36 个版本

0.13.7 2024 年 6 月 14 日
0.13.4 2024 年 1 月 4 日
0.13.3 2023 年 9 月 21 日
0.13.1 2023 年 1 月 27 日
0.1.1 2018 年 12 月 18 日

#40解析工具

Download history 2483/week @ 2024-05-03 3652/week @ 2024-05-10 3163/week @ 2024-05-17 3626/week @ 2024-05-24 3936/week @ 2024-05-31 3313/week @ 2024-06-07 3503/week @ 2024-06-14 4318/week @ 2024-06-21 4563/week @ 2024-06-28 3553/week @ 2024-07-05 2873/week @ 2024-07-12 3722/week @ 2024-07-19 3181/week @ 2024-07-26 2926/week @ 2024-08-02 2879/week @ 2024-08-09 3061/week @ 2024-08-16

12,677 每月下载量
9 crates 中使用

Apache-2.0/MIT

210KB
5K SLoC

cfgrammar

cfgrammar 读取语法文件,处理它们,并提供一个方便的 API 来操作它们。对于直接操作语法或希望使用自定义解析器类型的人来说可能很有趣。


lib.rs:

用于操作上下文无关文法(CFG)的库。由于无法完全统一所有语法类型,所以目标是让不同类型的语法有完全独立的实现。希望对多个语法类型进行泛型处理的代码可以使用“适配器”来统一感兴趣的特定语法类型。目前这有点学术性质,因为只支持 Yacc 风格的语法(尽管支持几种 Yacc 语法的变体)。

不幸的是,CFG 术语相当混乱。有些人对同一概念使用不同的术语;有些人使用不同的术语来传达细微的意义差异(但并不完全统一)。例如,“标记”、“终结符”和“词素”就是这种情况:在某些工具和论文中它们是同义词,但在其他情况下不是。

为了使这个库在某种程度上保持一致性,因此我们为一些主要概念使用一些基本的术语指南(承认这会导致与某些语法类型发生冲突)。

  • 一个 语法 是一系列 产生式 的有序序列。
  • 一个 产生式 是一系列 符号 的有序序列。
  • 一个 规则 将一个名称映射到一个或多个产生式。
  • 一个 标记 是一个句法元素的名称。

例如,在以下 Yacc 语法中

R1: "a" "b" | R2; R2: "c";

以下语句是正确的

  • 有 3 个产生式。1: ["a", "b"] 2: ["R2"] 3: ["c"]
  • 有两个规则:R1 和 R2。到产生式的映射是 {R1: {1, 2}, R2: {3}}
  • 有三个标记:a、b 和 c。

cfgrammar 对语法做出以下保证

  • 生成项从 0 编号到 prods_len() - 1(包含)。
  • 规则从 0 编号到 rules_len() - 1(包含)。
  • 记号从 0 编号到 toks_len() - 1(包含)。
  • 用于存储生成项、规则和记号索引的 StorageT 类型可以可靠地转换为 usize(有关详细信息,请参阅 TIdx 及其相关结构)。

对于大多数当前用途,主要需要调查的函数是 YaccGrammar::new() 和/或 YaccGrammar::new_with_storaget(),它们接受一个 Yacc 语法作为输入。

依赖项

~3.5–5.5MB
~94K SLoC