#parser-combinator #parser #text-parser #text-format

glue

Glue 是一个用于解析基于文本格式的解析器组合框架,易于使用,且相对较快。

10 个版本 (重大变更)

0.8.7 2019年12月21日
0.8.3 2019年8月30日
0.7.2 2019年12月19日
0.7.0 2019年7月11日

#88 in 解析工具

Download history 2/week @ 2024-03-14 45/week @ 2024-03-28 34/week @ 2024-04-04 2/week @ 2024-05-16 1/week @ 2024-05-23 2/week @ 2024-06-06 2/week @ 2024-06-13 66/week @ 2024-06-20 8/week @ 2024-06-27

78 每月下载量
用于 etch

MIT 许可证

70KB
1.5K SLoC

Glue v0.8

Glue 是一个用于解析基于文本格式的解析器组合框架,易于使用,且相对较快。

使用方法

使用 test 方法检查您的输入是否与解析器匹配

use glue::prelude::*;

if take(1.., is(alphabetic)).test("foobar") {
    println!("One or more alphabetic characters found!");
}

使用 parse 方法从您的输入中提取信息

use glue::prelude::*;

assert_eq!(take(1.., is(alphabetic)).parse("foobar"), Ok((
    ParserContext {
        input: "foobar",
        bounds: 0..6,
    },
    "foobar"
)))

编写您自己的解析器函数

use glue::prelude::*;

#[derive(Debug, PartialEq)]
enum Token<'a> {
    Identifier(&'a str),
}

fn identifier<'a>() -> impl Parser<'a, Token<'a>> {
    move |ctx| {
        take(1.., is(alphabetic)).parse(ctx)
            .map_result(|token| Token::Identifier(token))
    }
}

assert_eq!(identifier().parse("foobar"), Ok((
    ParserContext {
        input: "foobar",
        bounds: 0..6,
    },
    Token::Identifier("foobar")
)));

有关更多信息,请查看 示例目录代码仓库

速查表

查找器

用于匹配任意类型的解析器组合器。

find(重复:RangeBounds,parser: impl Parser)

运行解析器至少指定次数,最多指定次数,并捕获其结果。

请参阅 API 文档

find_all((impl Parser, ...))

按指定顺序运行提供的每个解析器,并返回所有结果。

请参阅 API 文档

find_any((impl Parser, ...))

运行提供的每个解析器,并返回第一个成功的解析器。

请参阅 API 文档

find_until(谓词: impl Parser, parser: impl Parser)

运行解析器,直到达到谓词,并捕获其结果。

请参阅 API 文档

find_separated(重复:RangeBounds,parser:Parser,分隔符:Parser)

解析由分隔符分隔的多个解析器组成的结构。

请参阅 API 文档

find_when(谓词:Parser,parser:Parser)

运行解析器,如果成功,则运行另一个解析器并返回其结果。

请参阅 API 文档

find_when_not(谓词:Parser,结果:Parser)

运行解析器,如果不成功,则运行另一个解析器并返回其结果。

请参阅 API 文档

获取器

字符串匹配的解析组合器。

take(重复:RangeBounds,parser: impl Parser)

运行解析器至少指定次数,最多指定次数,并捕获它解析的输入。

请参阅API 文档

take_all((impl Parser, ...))

按指定顺序运行提供的每个解析器,并返回所有匹配的输入。

请参阅API 文档

take_any((impl Parser, ...))

运行提供的每个解析器,直到其中一个成功,并返回它解析的输入。

请参阅API 文档

take_until(重复:RangeBounds,谓词: impl Parser, parser: Parser)

运行解析器,直到达到谓词,并捕获它解析的输入。

请参阅API 文档

匹配器

用于匹配字面量的解析组合器。

empty()

匹配无内容并始终成功,在元组中用作占位符。

请参阅API 文档

eoi()

匹配输入的结束。

请参阅API 文档

is(test: impl Tester)

使用字符串或字符字面量、回调或实现 Tester 的实例进行匹配。

请参阅下面的 Testers[测试器] 或 API 文档

isnt(test: impl Tester)

使用字符串或字符字面量、回调或实现 Tester 的实例进行否定匹配。

请参阅下面的 Testers[测试器] 或 API 文档

one_of(test: &str)

将下一个字符与这些字符之一进行匹配。

请参阅下面的 Testers[测试器] 或 API 文档

soi()

匹配输入的开始。

请参阅API 文档

映射器

将一种事物映射到另一种事物的解析组合器。

map_error(parser: impl Parser, map: FnMut)

运行解析器并将它返回的错误映射到不同的错误。

请参阅API 文档

map_result(parser: impl Parser, map: FnMut)

运行解析器并将它返回的数据映射到成功。

请参阅API 文档

optional(parser: impl Parser)

运行解析器,在成功时返回 Some,在失败时返回 None

请参阅API 文档

结构

用于匹配结构的解析组合器。不是默认预置的一部分,需要手动包含这些组合器

use glue::combinators::structures::*;

delimited(prefix: impl Parser, parser: impl Parser, suffix: impl Parser)

匹配由平衡分隔符包围的结构。

请参阅API 文档

left_delimited(prefix: impl Parser, parser: impl Parser)

匹配带有左侧分隔符的结构。

请参阅API 文档

right_delimited(parser: impl Parser, suffix: impl Parser)

匹配带有右侧分隔符的结构。

请参阅API 文档

separated(left: impl Parser, 分隔符: impl Parser, right: impl Parser)

匹配由另一个解析器分隔的两个解析器组成的结构。

请参阅API 文档

空白符

用于处理空白符的解析器组合器。不是默认引言的一部分,需要手动包含这些组合器。

use glue::combinators::whitespace::*;

space(重复:RangeBounds)

匹配空白字符的缩写。

请参阅API 文档

trim(parser: impl Parser)

从解析器中去除前后空白。

请参阅API 文档

字符

实现 Tester 的字符匹配方法,用于与 isisnt 解析器组合器一起使用。

any

匹配任何字符。

one_of("abc")"abc".chars()

将下一个字符与这些字符之一进行匹配。

alphabetic

匹配任何字母字符。

alphanumeric

匹配任何字母数字字符。

numeric

匹配任何数字字符。

digit

匹配任何十进制数字。

hex_digit

匹配任何十六进制数字。

whitespace

匹配任何空白字符。

依赖项

~27KB