#ron #parser #notation #object #experimental #stop #parser-combinator

bin+lib ron-utils

Rusty Object Notation (RON) 文件处理的工具

7 个版本

0.1.0-preview82021年10月25日
0.1.0-preview72021年10月24日
0.1.0-preview62021年10月23日
0.1.0-preview42021年10月17日

#ron 中排名 15

每月下载量 22

Unlicense 协议

215KB
6K SLoC

实验:Rusty Object Notation 重新启动

使用状态解析器上的小函数解析器对单个语法元素进行解析的新解析器的实验性实现。

这个实验最初是 "RON + nom",但现在使用它自己的解析器和组合器,灵感来自 nom

动机

当前的 ron 解析存在以下问题

  • 解析在 parse.rs 和反序列化器本身中同时进行
    • 代码组织不良
    • 难以维护
    • 限制了重用
  • serde 的数据模型阻止我们准确地反映结构体 / 映射和结构体名称

优势

无状态的 / 函数式解析器

  • 更容易维护
  • 更容易重用
  • 更容易测试

抽象语法树 (AST)...

  • 使得反序列化器更容易且更干净地实现
  • 允许报告语法和类型错误的地点
  • 可以被多个反序列化器实现重用 (serde::Deserializer, our_own::Deserializer, ron-edit)

错误报告

旧的 RON 反序列化器产生的错误通常很难理解。ron-reboot 旨在改变这一点;这是 2021-10-15 的反序列化错误输出

error: invalid type: boolean `true`, expected a string
 --> string:3:9
  |
3 |       y: true,
  |          ^^^^
  |

或使用多行表达式

error: invalid type: map, expected a string
 --> string:3:9
  |
3 |       y: (
  |  ________^
4 | |         this: "is",
5 | |         not: "the right type",
6 | |     ),
  | |______^
  |

目标 / 进展

目标 状态
生成 AST 的解析器 ✔️ 完成
生成美观错误的解析器 ✔️ 完成
从 AST 准确反序列化值 ✔️ 完成
替换 nom 组合器 ✔️ 完成
AST 中的跨度(错误报告的位置) ✔️ 完成
使用 AST 的 serde 反序列化器 ✔️ 完成
生成美观错误的 serde 反序列化器 ✔️ 完成
ron-edit(格式和注释保留的写入器) ❌ 待完成

贡献

除非你明确声明,否则你提交的任何有意包含在工作中的贡献,都应按照本项目的许可证(Apache-2.0)许可,不附加任何额外条款或条件。

依赖关系

~3MB
~51K SLoC