#parser-combinator #streaming-parser #parser #streaming

nightly parseLL

ParseLL LL(1) 流式解析器组合器

17 个版本 (5 个破坏性更新)

使用旧的 Rust 2015

0.6.5 2016年3月7日
0.6.4 2016年3月4日
0.5.0 2016年2月24日
0.4.3 2016年2月23日
0.1.1 2016年2月8日

253解析工具

Download history 5/week @ 2024-03-28 1/week @ 2024-04-04

每月55次 下载

MPL-2.0 许可证

115KB
2K SLoC

ParseLL:Rust 的 LL(1) 流式解析器组合器库

此库的目标是提供解析器组合器,

  • 针对 LL(1) 文法进行了优化,
  • 支持流式输入,
  • 尽可能减少缓冲或复制,
  • 尽可能减少动态方法调度。

它基于

Rustdoc | 视频 | 幻灯片 | Crate | CI

示例

extern crate parsell;
use parsell::{character,Parser,UncommittedStr,StatefulStr};
use parsell::ParseResult::{Done,Continue};
#[allow(non_snake_case)]
fn main() {

    // A sequence of alphanumerics, saved in a string buffer
    let ALPHANUMERIC = character(char::is_alphanumeric);
    let ALPHANUMERICS = ALPHANUMERIC.plus(String::new);

    // If you provide unmatching input to the parser, you'll get back a None response:
    match ALPHANUMERICS.init_str("!$?") {
        None => (),
        _ => panic!("Can't happen."),
    }

    // If you provide complete input to the parser, you'll get back a Done response:
    match ALPHANUMERICS.init_str("abc123!") {
        Some(Done(result)) => assert_eq!(result, "abc123"),
        _ => panic!("Can't happen."),
    }

    // If you provide incomplete input to the parser, you'll get back a Continue response:
    match ALPHANUMERICS.init_str("abc") {
        Some(Continue(parsing)) => match parsing.more_str("123!") {
            Done(result) => assert_eq!(result, "abc123"),
            _ => panic!("Can't happen."),
        },
        _ => panic!("Can't happen."),
    }

}

示例使用 Skeptic 测试。

无运行时依赖

~150KB