#byte-string #lexing #match #codegen #parser #byte-sequences

matchgen

生成函数以快速将字节字符串前缀映射到值

3个版本 (重大变更)

0.3.0 2024年6月18日
0.2.0 2023年5月27日
0.1.0 2023年2月27日

#707编码

每月 28 次下载
5 个crate中使用(通过htmlize

MIT/Apache

215KB
457

生成函数以快速将字节字符串前缀映射到值

docs.rs Crates.io Rust version 1.60+

TreeMatcher 可用于构建脚本中生成将字节序列映射到任意值的匹配器函数。它返回映射值(或 None)和输入的剩余部分。

例如,假设你生成一个名为 entity_matcher() 的匹配器来处理所有HTML实体

assert!(entity_matcher(b"×XYZ") == (Some("×"), b"XYZ".as_slice()));
  • 它检查的前缀不必都是相同长度。
  • 如果多个前缀匹配,它将返回最长的那个。
  • 如果没有匹配,它将返回 (None, &input)

由于匹配器只检查输入的开始部分,你可能需要使用 iter().position()memchr crate 来查找潜在匹配的开始位置。

它也可以配置为接受字节迭代器作为输入,而不是切片。

简单示例

要创建一个处理四个基本HTML实体的匹配器,可以使用以下构建脚本

use matchgen::TreeMatcher;
use std::env;
use std::error::Error;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::Path;

fn main() -> Result<(), Box<dyn Error>> {
    let out_path = Path::new(&env::var("OUT_DIR")?).join("matcher.rs");
    let mut out = BufWriter::new(File::create(out_path)?);

    TreeMatcher::new("pub fn entity_decode", "u8")
        .doc("Decode basic HTML entities.")
        .add(b"&amp;", "b'&'")
        .add(b"&lt;", "b'<'")
        .add(b"&gt;", "b'>'")
        .add(b"&quot;", "b'\"'")
        .render(&mut out)?;

    Ok(())
}

要使用匹配器

include!(concat!(env!("OUT_DIR"), "/matcher.rs"));

fn main() {
    assert_eq!(
      entity_decode(b"&amp; on &amp; on"),
      (Some(b'&'), b" on &amp; on".as_slice()),
    );
}

开发状态

这可能是稳定的。我在等待一段时间,看看是否能想出新的功能或更好的实现相同功能的途径,然后再发布1.0版本。

我愿意接受 建议

许可

本项目采用Apache 2和MIT许可证双重许可。您可以选择使用其中之一。

贡献

除非您明确声明,否则您根据Apache 2.0许可证提交的任何贡献都将按照上述方式双许可,不附加任何额外的条款或条件。

无运行时依赖