20次发布
0.3.6 | 2022年11月21日 |
---|---|
0.3.4 | 2022年11月3日 |
0.3.3 | 2022年10月31日 |
0.3.0 | 2022年9月20日 |
#250 in WebAssembly
每月下载90次
用于12个crate(5个直接使用)
25KB
772 行
COSMIC NOM
是一个用于使优秀的nom解析器组合器更易于使用的工具集合。
COSMIC 初始化计划
cosmic-nom
是The Cosmic Initiative
的一部分,这是一个WebAssembly编排框架——尽管你可以将其用于任何你想要的项目。
派生作品的派生作品
cosmic-nom
综合了两个nom派生工具的实用程序
- nom-supreme 一组用于nom的优秀实用程序(
cosmic-nom
使用它来改进错误处理) - nom-locate nom的特殊输入类型,用于定位标记(
cosmic-nom
使用它来定位解析内容的错误范围)
COSMIC NOM的贡献
实现
要使用cosmic-nom
,您必须接受实现trait cosmic_nom::Span
的输入并返回类型为cosmic_nom::Res
的结果
pub fn name<I:Span>( input:I ) -> Res<I,I> {
alpha(input)
}
范围
由于如果您的输入类型没有实现每个条件中使用的所有trait(例如InputLength,InputTakeAtPosition,AsBytes等),则很难组合组合器。因此,cosmic-nom
提供了一个支持通过nom_locate
进行位置捕获的单个trait,并且似乎与complete
包中的每个组合器都兼容(未在流上进行测试)。
pub trait Span:
Clone
+ ToString
+ AsBytes
+ Slice<Range<usize>>
+ Slice<RangeTo<usize>>
+ Slice<RangeFrom<usize>>
+ InputLength
+ Offset
+ InputTake
+ InputIter<Item = char>
+ InputTakeAtPosition<Item = char>
+ Compare<&'static str>
+ FindSubstring<&'static str>
+ core::fmt::Debug
要创建一个span,请调用 cosmic_nom::new_span("scott williams")
name(new_span("scott williams"));
结果
使用 result
将你的 Res
转换为常规的 Result<O,E>
let name: I = result(name(new_span("scott williams")))?;
日志
你可以将你的结果包裹在log()中,如果发生错误,它将输出到stdout
let name: I = log(result(name(new_span("scott williams"))))?;
重要!
请注意,为了使事物更加简单和易于报告,cosmic-nom
在某些方面牺牲了nom的强大功能...例如,nom由于其“零拷贝”输入策略而具有很高的效率,它似乎通过传递和切片单个&str来实现这一点... cosmic-nom
将输入包裹在Arc中,并仍然非常注意最小化开销,但它违背了nom的纯粹精神,以提供一些使用上的便利。
依赖项
约3.5MB
约71K SLoC