2 个不稳定版本
新 0.2.0 | 2024 年 8 月 12 日 |
---|---|
0.1.0 | 2024 年 8 月 10 日 |
#665 在 解析器实现 中
每月 210 次下载
44KB
1K SLoC
rsedn
rsedn
是一个 crate,实现了 Extensible Data Notation 的一个子集(目前)
支持的语法
-
( )
列表 -
[ ]
向量 -
{ }
映射 -
#{ }
集合 -
symbols
(完整的 edn 符号规范) -
:关键字
-
#用户/标签
-
#_discard
(尚未删除,只是进行了解析) - 整数(不支持任意精度的整数)
- 浮点数
- 布尔值
-
nil
- 字符串(不支持
\uNNNN
Unicode 序列) - 字符
- 内置标签元素(
#inst
和#uuid
) - 注释
用法
rsedn
的用法分为 4 步
- 从一个
&str
构建一个Source
(使用rsedn::source_from_str
) - 将
Source
词汇化以生成一个Vec<Lexeme>
(使用rsedn::lex_source
) - 解析每个
Lexeme
以生成一个Token
(使用rsedn::parse_lexeme
) - 创建一个
TokenStream
(使用LinkedList::iter
)并消费它以生成一个Form
(使用rsedn::consume_token_stream
)
概念
源
源代码的包装器,我们通常将源代码称为 &'source str
。它可以后来用来获取某些 Lexeme
的范围(实际文本)。
Lexeme
存储有意义源代码片段的坐标(仅坐标,无文本),它不对其进行分类,只知道给定的文本片段可能具有意义。
例如:(println)
有 3 个 lexeme:(
、println
和 )
,(def var 5)
有 5 个 lexeme:(
、def
、var
、5
和 )
Token
Lexeme 的包装器,它存储范围和它是什么类型的标记。它通过读取范围并检查相应源代码片段的语法来分类。
当 lexeme 在语法上不正确时,生成 Token
可能会产生 TokenizationError
。
Form
最后一步,它由一个或多个标记构建而成,代表一个 edn
形式:列表、向量、符号等。
除了将文本解析为值(如 i64
、f64
、bool
和 String
对应 edn
形式)外,几乎不对源文本进行操作。
你可以使用这个库中的形式。
当标记流中的标记不是预期的时,生成形式可能产生 ParsingError
。
依赖项
~1.5MB
~22K SLoC