2 个不稳定版本

0.2.0 2023 年 8 月 31 日
0.1.0 2023 年 8 月 23 日

#112 in 解析工具

自定义许可证

140KB
3K SLoC

AOTT - 标记的方面

AOTT 是一个解析器组合框架 - 一个包含用于轻松创建解析器的工具的库。

它还包含一些内置工具,例如用于处理文本的解析器(见 text 模块;在 builtin-text 标志下功能受限,默认启用),以及一些用于处理字节的便捷解码器(见 bytes 模块;在 builtin-bytes 标志下功能受限,默认不启用)。

功能

  • 🪄 富有表现力的内置组合器,使编写解析器变得愉快
  • 🎛 完全泛型,支持输入、标记、输出、范围和错误类型
  • 📑 零拷贝解析 从库中构建,最小化解析器分配需求
  • 📖 文本和字节解析器 用于文本和字节输入(即:&[u8] 和 &str)

示例解析器

请参阅 examples/brainfuck.rs 了解完整解释器(cargo run --example brainfuck - examples/sample.bf)。

use aott::prelude::*;

#[derive(Clone, Debug)]
enum Instruction {
        Left,
        Right,
        Increment,
        Decrement,
        Read,
        Write,
        Loop(Vec<Self>),
}

#[parser]
fn parse(input: &str) -> Vec<Instruction> {
        choice((
                // Basic instructions are just single characters!
                just('<').to(Instruction::Left),
                just('>').to(Instruction::Right),
                just('+').to(Instruction::Increment),
                just('-').to(Instruction::Decrement),
                just(',').to(Instruction::Read),
                just('.').to(Instruction::Write),
                // recursion is easy: just put in the function as is!
                delimited(just('['), parse, just(']')).map(Instruction::Loop),
        ))
        // Brainfuck is sequential, so we parse as many instructions as is possible
        .repeated()
        .parse(input)
}

解析器组合器是什么?

解析器组合器是一种通过定义其他解析器来实现解析器的技术。

这意味着您构建较小的解析器,例如字符串解析器,然后构建更大的解析器,如表达式、语句、函数等。这种从小到大的创建解析器的方式称为 递归下降策略

解析器组合器类似于Rust的Iterator特质,用于定义解析算法:Iterator的类型驱动API使得出错的可能性大大降低,并且比手动编写相同的代码更容易编码复杂的迭代逻辑。解析器组合器也是如此。

为什么我要使用解析器组合器呢?

随着解析器功能的增加,编写具有良好错误恢复功能的解析器会变得越来越困难。这需要理解递归下降算法的复杂性,然后在其基础上实现恢复策略。

如果您正在开发,比如说,一种编程语言,或者仅仅是刚开始,您会发现您会非常频繁地做出许多小的更改。如果您手动编写解析器,那么对解析器进行重构以适应这些更改将是一个缓慢且痛苦的过程。

解析器组合器通过提供一个便于操作且允许快速迭代语法的API,解决了这两个问题。

解析器组合器也非常适合领域特定语言(DSL),对于这些语言来说,还没有现成的解析器。如果您使用一个不错的解析器组合器库,编写可靠、容错性强的解析器可以从一项可能需要数周的任务变成一项只需半小时的任务。

(正在进行中) 错误恢复

当前AOTT还没有错误恢复功能,但很快就会有。已经有一些用于恢复的代码,但尚未使用、文档化或测试。

兼容性

AOTT设计为与chumsky兼容,因此现有的chumsky解析器将可以正常工作/进行最少的更改(例如移除生命周期... "我讨厌生命周期参数!生命周期参数很糟糕!")。将提供一份用于修复解析器的正则表达式列表永远不会很快。关于生命周期参数。我想要创建一个接近无生命周期的chumsky,其中函数是解析的主要单元(就像在nom中一样!),经过数小时的痛苦和挣扎努力,我有了这个。一个接近无生命周期的chumsky,其中包含函数。耶。

感谢

  • @zestererchumsky上的出色工作,以及在Rust社区Discord服务器上的帮助
  • 感谢所有nom的贡献者,他们的解析器组合器框架库真正令人鼓舞
  • @abs0luty 在库的早期阶段提供的帮助和潜在特性的想法。

许可证

Aspect Of The Tokens遵循MIT许可证(见仓库根目录中的LICENSE文件)

依赖项

~1.9–2.6MB
~43K SLoC