#解析器 #无分配 #解析输入 #无std

无std transduce

零拷贝同构解析:你的代码应该看起来像它所解析的内容

8个版本

0.4.4 2023年6月27日
0.4.3 2023年6月27日
0.3.0 2023年6月16日
0.2.1 2023年6月11日

#67 in 解析工具

每月 45 次下载

MPL-2.0 许可证

72KB
2K SLoC

transduce: 零拷贝同构解析

你的代码应该看起来像它所解析的内容。

请参见 lib.rs 中的此示例

let parser = exact(&b'(') >> verbatim() << exact(&b')');
let input = b"(*)";
assert_eq!(
    parser.parse(input),
    Ok(&b'*'), // Reference to the region of input inside parentheses
);
// Or, equivalently:
assert_eq!(
    parenthesized(verbatim).parse(input),
    Ok(&b'*'),
);

这确实做了它看起来要做的。

等价于:

assert_eq!(parenthesized(verbatim()).parse(rawstr.chars()), Ok('*'))

美观的打印错误

parse 方法自动定位错误(甚至对于用户定义的解析器)并打印出精美的、带有颜色的Rust风格错误

(exact(b'?') >> exact(b'?')).parse_or_panic(b"???");
...| Error while parsing:
 1 | ???
   |   ^ Unparsed input remains after parsing what should have been everything

 

(verbatim() & verbatim() & verbatim() & verbatim()).parse_or_panic(b"???");
...| Error while parsing:
 1 | ???
   |    ^ Reached end of input but expected an item

 

(verbatim() << exact(b'!')).parse_or_panic(b"???")
...| Error while parsing:
 1 | ???
   |  ^ Expected 33 but found 63

依赖项与 no_std

这个crate没有依赖项。它也是完全的 no_std;甚至不需要 std 版本。

如果你(出于某种原因?)想在微控制器上运行此程序或者不需要堆分配,可以禁用 alloc 功能。整个核心仍然可以工作,但 base 中的某些解析器(涉及编译时长度未知的向量,例如 comma_separated)将不可用。

感谢

向UPenn的CIS 194和Haskell的194课程中学到的高阶解析库表示敬意。

无运行时依赖