11 个版本

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

#1498 in 解析器实现

每月 42 次下载
用于 ron-utils

无许可证

210KB
6K SLoC

实验:Rusty 对象表示法重启

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

这个实验最初是 "RON + nom",但现在正在使用其自己的解析器和组合器,这些解析器和组合器受到了 nom 的启发。

动机

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

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

优势

无状态/函数解析器更易于

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

抽象语法树 (AST)...

  • 使得反序列化更容易且更简洁
  • 允许报告语法和类型错误的位置
  • 可以由多个反序列化器实现重用 (serde::Deserializerour_own::Deserializerron-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(格式和注释保留的写入器) ❌ 待完成

贡献

除非您明确声明,否则您有意提交以包含在您的工作中的任何贡献,都应按照本项目的许可证(The Unlicense)进行许可,没有任何额外的条款或条件。

依赖项

~170KB