#edn #data #deserialize #serialization #element

rsedn

一个用于读取和写入 EDN (可扩展数据表示) 数据的 Rust 库

2 个不稳定版本

0.2.0 2024 年 8 月 12 日
0.1.0 2024 年 8 月 10 日

#665解析器实现

Download history 210/week @ 2024-08-10

每月 210 次下载

MIT 许可证

44KB
1K SLoC

rsedn

rsedn 是一个 crate,实现了 Extensible Data Notation 的一个子集(目前)

支持的语法

  • ( ) 列表
  • [ ] 向量
  • { } 映射
  • #{ } 集合
  • symbols(完整的 edn 符号规范)
  • :关键字
  • #用户/标签
  • #_discard(尚未删除,只是进行了解析)
  • 整数(不支持任意精度的整数)
  • 浮点数
  • 布尔值
  • nil
  • 字符串(不支持 \uNNNN Unicode 序列)
  • 字符
  • 内置标签元素(#inst#uuid
  • 注释

用法

rsedn 的用法分为 4 步

  1. 从一个 &str 构建一个 Source(使用 rsedn::source_from_str
  2. Source 词汇化以生成一个 Vec<Lexeme>(使用 rsedn::lex_source
  3. 解析每个 Lexeme 以生成一个 Token(使用 rsedn::parse_lexeme
  4. 创建一个 TokenStream(使用 LinkedList::iter)并消费它以生成一个 Form(使用 rsedn::consume_token_stream

概念

源代码的包装器,我们通常将源代码称为 &'source str。它可以后来用来获取某些 Lexeme 的范围(实际文本)。

Lexeme

存储有意义源代码片段的坐标(仅坐标,无文本),它不对其进行分类,只知道给定的文本片段可能具有意义。

例如:(println) 有 3 个 lexeme:(println)(def var 5) 有 5 个 lexeme:(defvar5)

Token

Lexeme 的包装器,它存储范围和它是什么类型的标记。它通过读取范围并检查相应源代码片段的语法来分类。

当 lexeme 在语法上不正确时,生成 Token 可能会产生 TokenizationError

Form

最后一步,它由一个或多个标记构建而成,代表一个 edn 形式:列表、向量、符号等。

除了将文本解析为值(如 i64f64boolString 对应 edn 形式)外,几乎不对源文本进行操作。

你可以使用这个库中的形式。

当标记流中的标记不是预期的时,生成形式可能产生 ParsingError

依赖项

~1.5MB
~22K SLoC