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

Download history 32/week @ 2024-03-11 27/week @ 2024-03-18 37/week @ 2024-03-25 53/week @ 2024-04-01 20/week @ 2024-04-08 23/week @ 2024-04-15 27/week @ 2024-04-22 23/week @ 2024-04-29 28/week @ 2024-05-06 26/week @ 2024-05-13 21/week @ 2024-05-20 16/week @ 2024-05-27 19/week @ 2024-06-03 23/week @ 2024-06-10 23/week @ 2024-06-17 24/week @ 2024-06-24

每月下载90
用于12个crate(5个直接使用)

MIT许可证

25KB
772

COSMIC NOM

是一个用于使优秀的nom解析器组合器更易于使用的工具集合。

COSMIC 初始化计划

cosmic-nomThe 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