3个版本 (破坏性)

0.6.0 2024年3月27日
0.5.0 2024年2月7日
0.1.0 2023年11月10日

#530解析器实现


被用于 beancount-parser-lima-pyt…

MIT/Apache

240KB
6.5K SLoC

beancount-parser-lima

Rust中的Beancount零拷贝解析器。

它旨在成为Beancount文件格式的完整实现,除了那些已弃用的部分以及在此处(可能不全面的列表)中记录的其他功能。

目前正在积极开发中。API可能会发生变化,但希望不会太大。

这个有些奇怪的名字是因为我在启动此项目时疏忽大意地没有注意到现有的 beancount-parser,对此表示歉意。

特性

  • 快速,归功于 LogosChumsky 零拷贝

  • 漂亮的错误消息,归功于 Ariadne

  • 应用程序的接口,以便它们也可以在其原始上下文中报告漂亮的错误,如下例所示

  • 关注映射到Rust类型的应用领域对象的语义清晰度

  • Python绑定(正在进行中)

Example application error messages

路线图和状态

  • 创建Python绑定,以便这可以成为现有Beancount解析器的直接替换(这并不意味着它一定会成为那样!)

  • 根据经验改进API,即在它得到一些使用时😅

  • 解决发现时的错误、误解和边缘情况

beancount-parser-lima v0.2.1 能够解析来自官方 Beancount仓库example.beancount 文件。

示例

转储

这仅解析Beancount文件并输出解析结果,使用解析器输出类型的显示实现。特殊文件名 STDIN 使其从标准输入读取并解析结果的内联字符串。

cargo run --example dump -- ./examples/data/full.beancount

检查

这是应用程序而不是解析器报告源位置错误的示例。这对于语义错误不是核心解析器检测和报告的业务很重要。

cargo run --example check -- ./examples/data/full.beancount

不确定性 / TODOs

是的,Beancount比较复杂,我可能在这里犯了一些错误。以下是不确定的当前列表,肯定不是全面的。

  • 指令的元数据标签/链接与指令标题行中的那些合并

不支持

这是目前不支持的一项不完全列表。

  • 自定义指令

不支持选项

  • allow_pipe_separator
  • allow_deprecated_none_for_tags_and_links
  • default_tolerance
  • experiment_explicit_tolerances
  • insert_pythonpath
  • plugin
  • tolerance
  • use_legacy_fixed_tolerances

此外,不支持一元选项。

解析器测试

解析器测试用例基于Beancount自身的解析器测试,提取为独立于语言的格式。也就是说,所有原始测试都已在下面复制,并增加了一些。

每个测试包括一个Beancount文件和预期的解析输出,格式为Protobuf文本格式语言,使用来自Beancount仓库的Beancount Protobuf模式

本仓库中的错误情况已转换为与解析器期望的错误消息输出匹配。

与原始Beancount解析器不同的行为已在测试中用异常标注。

不支持Lima解析器的功能测试留在test-cases-unsupported中。

Alpha状态依赖

  • 需要Chumsky 1.0.0.alpha.*版本以支持零拷贝。

  • 需要smallvec 2.0.0-alpha.*版本以正确推断生命周期。

替代方案

beancount-parser是另一个Beancount解析器,比这个更早,使用nom而不是Chumsky

许可

根据您的选择,许可方式如下

贡献

除非您明确声明,否则任何旨在包含在您的工作中的贡献,根据Apache-2.0许可定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~14MB
~209K SLoC