2个不稳定版本

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

#128 in #parser-combinator


用于 aott

MIT 许可证

13KB
100

AOTT - Token的方面

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 trait,用于定义解析算法:Iterator的类型驱动API使得犯错误的可能性大大降低,而且编写复杂的迭代逻辑也比手动编写代码要容易得多。解析器组合子也是如此。

为什么我甚至应该使用解析器组合子?

随着解析器功能的增加,编写具有良好错误恢复功能的解析器的难度会呈指数级增长。这需要理解递归下降算法的复杂性,然后在其之上实现恢复策略。

如果你正在开发,比如说,一种编程语言,或者仅仅是刚刚开始,你会发现你经常会做出很多小的改动。而且如果你手动编写解析器,你需要进行缓慢而痛苦的重构步骤以适应这些改动。

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

解析器组合子也非常适合特定领域语言(DSL),因为目前没有现成的解析器。如果你使用一个合适的解析器组合子库,将可靠、容错性强的解析器从需要数周的任务缩短到半小时的任务。

(WIP) 错误恢复

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

兼容性

AOTT设计为与chumsky兼容,因此现有的chumsky解析器将正常工作/只需做最小的改动(例如删除生命周期... "我恨生命周期参数!生命周期参数很糟糕!")。将提供一份用于修复解析器的正则表达式列表,永远不会很快。关于生命周期参数。我想创建一个几乎不需要生命周期的chumsky,其中函数是解析的主要单元(就像在nom中一样),经过数小时痛苦和挣扎的努力,我有了这个。几乎不需要生命周期的chumsky,有函数。太好了。

感谢以下人员

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

许可证

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

依赖关系

~300–760KB
~18K SLoC