#yaml-parser #educational #file #data #grammar #cli

bin+lib simple_yaml_parser_kma

用于教育项目的简单 YAML 解析器

1 个不稳定版本

0.1.0 2023年11月22日

#2032解析实现

MIT 许可证

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. 每个元素都有深度 1,因此它不能包含超过一个内部元素组
  3. 每个内部键值对前面的缩进等于 2

有效的简单 yaml 文件,黄色 - 子节点

用法

/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

pest

anyhow

依赖项

~4MB
~77K SLoC