1 个不稳定版本
0.1.0 | 2023年11月22日 |
---|
#2032 在 解析实现
53KB
121 行
YAML 解析器
使用 pest crate 编写的简单且严格的 YAML 格式解析器。
任务描述
! 简要描述:在 Readme.md 和 Cargo.toml 文件中包含对想法的简要描述。Readme.md 必须包含解析过程的技术描述,详细说明正在解析什么以及如何使用解析结果。
! 项目名称:项目名称必须反映想法,并包含在 Readme.md 和 Cargo.toml 文件中。
! 语法规则:为解析器开发至少 1 个语法规则。
! 单元测试:为解析器实现单元测试;这些测试可以放在 tests 目录下的单独文件中。
! 测试覆盖率:确保每个语法规则至少有一个单元测试覆盖。
! 核心文件:项目必须包括 lib.rs 和 main.rs 文件。
! 命令行界面:创建一个命令行界面,包括解析文件和显示帮助及版权信息的命令。
错误处理:通过在测试中使用 anyway 和在库中使用 thiserror 来实现适当的错误处理。
应使用 cargo fmt 进行代码格式化。
应使用 cargo clippy 进行代码质量检查。
Makefile 应包括启动程序和运行测试、格式化和 clipply 的命令,以及其他有用的命令。
完整性:项目必须完全完成。
在 Readme.md 中包含图表或语法可以有助于理解解析逻辑。
文档:在每个语法规则中嵌入文档,确保文档出现在 docs.rs 上。
在 crates.io 上发布最终版本的包。
YAML 数据类型描述
YAML 文件使用缩进和空白来定义数据结构。它不依赖于像 JSON 这样的显式符号,这使得人类更容易阅读和编写。
---
element1: "value1"
element2: "value2"
...
更多示例
---
name: Alisa
age: 20
hobbies:
- reading
- hiking
address:
city: Kyiv
country: Ukraine
yaml 和 json 文件类型之间的主要区别是 yaml 不使用任何特定的分隔符,除了空格、: 和 -。有许多 yaml 验证器,其中大多数支持除基本规则外的不同规则。此解析器与具有严格结构的 yaml 文件一起工作。
- 文件可以以 --- 开始和/或以 ... 结束
- 每个元素都有深度 1,因此它不能包含超过一个内部元素组
- 每个内部键值对前面的缩进等于 2
有效的简单 yaml 文件,黄色 - 子节点
crates.io 链接
用法
/target/debug/simple_yaml_parser <filepath-to-parse>
/target/debug/simple_yaml_parser --help
代码流程
lib.rs 引入所有必要的工具,并包含用于从文件读取数据的函数。main.rs 引入所有内容(特别是来自 lib.rs 文件的内容),然后进入主函数。测试文件放在 tests 文件夹中。语法测试可以在名为 grammar_tests.rs 的文件中找到。读取用户提供的文件数据 -> 将数据传递给解析函数 -> 将解析后的数据序列化为稍微修改过的内容(序列化数据不包含破折号)
规则描述
第一个定义的规则 full_yaml 通过检查是否以 --- 开头来确定输入文件是否可能包含有效的 YAML 结构。稍后,我将为 YAML 的每个子结构创建另一个规则,并将它们组合在这个规则中。
规则 | 描述 |
---|---|
full_yaml | 匹配可以以 --- 开头并以 ... 结尾的整个 YAML 文件 |
对象 | 匹配 1 次或多次出现的键值对 |
helpnode | 匹配出现在子节点中的键值对 |
子节点 | 定义的键的内部节点 |
key_value | 匹配每个字符串和值对,这些值对由冒号和 0 个或 1 个空格分隔 |
值 | 子节点或标量,每个子节点必须从新的一行开始,以便键和值(子节点)位于不同的行中 |
标量 | 换行符,可以是任何可用的数据类型 |
数字 | 匹配任何整数或浮点数(双精度)或格式为 a^x 的数字 |
布尔值 | 真或假 |
空值 | 空值 |
字符串 | 任何 ASCII 字母(带或不带数字),可以包含破折号 |
行尾 | 定义了 3 个不同的“行结束”字符 |
缩进 | 在子节点的每个键值对开头使用的 2 个空格 |
使用的 Crates
依赖项
~4MB
~77K SLoC