16个版本 (8个重大更新)

0.9.1 2023年12月27日
0.9.0 2023年3月23日
0.8.0 2021年8月31日
0.7.0 2020年11月26日
0.2.1 2019年7月29日

解析器实现 中排名 120

Download history 2305/week @ 2024-04-08 2164/week @ 2024-04-15 2272/week @ 2024-04-22 2627/week @ 2024-04-29 2628/week @ 2024-05-06 2016/week @ 2024-05-13 2399/week @ 2024-05-20 1988/week @ 2024-05-27 2438/week @ 2024-06-03 2255/week @ 2024-06-10 2254/week @ 2024-06-17 1968/week @ 2024-06-24 1377/week @ 2024-07-01 1906/week @ 2024-07-08 1983/week @ 2024-07-15 1960/week @ 2024-07-22

每月下载量 7,357
用于 23 个crate(6 个直接使用)

MIT/Apache

29KB
591

nom-tracable

nom的解析器追踪扩展。

Actions Status Crates.io Docs.rs

功能

  • 以彩色格式追踪解析器
  • 向前/向后调用计数
  • 折叠特定解析器
  • 解析器调用计数的直方图/累计直方图
  • 禁用追踪时无开销

nom-tracable

要求

nom必须为5.0.0或更高版本。nom-tracable只能应用于函数式解析器。

nom解析器的输入类型必须实现Tracable特质。因此&str&[u8]不能使用。您可以定义&str&[u8]的包装类型并实现Tracable

nom-tracable与nom_locate集成。您可以使用nom_locate::LocatedSpan<T, TracableInfo>作为输入类型。这个crate实现了Tracable

注意:在nom_locate::LocatedSpan<T, TracableInfo>中的T必须实现FragmentDisplay。在本crate中,&str&[u8]实现了它。如果您想使用另一个类型作为T,则应为此类型实现FragmentDisplay

用法

[features]
default = []
trace   = ["nom-tracable/trace"]

[dependencies]
nom-tracable = "0.9.1"

nom-tracable 提供了 trace 功能,使用 nom-tracable 的 crate 也必须提供此功能。当 trace 被启用时,将启用跟踪转储。如果没有启用,则没有额外成本。

示例

您可以通过以下命令尝试示例。

$ cargo run --manifest-path=nom-tracable/Cargo.toml --example str_parser --features trace
$ cargo run --manifest-path=nom-tracable/Cargo.toml --example u8_parser --features trace

str_parser 如下所示

use nom::branch::*;
use nom::character::complete::*;
use nom::IResult;
use nom_locate::LocatedSpan;
use nom_tracable::{cumulative_histogram, histogram, tracable_parser, TracableInfo};

// Input type must implement trait Tracable
// nom_locate::LocatedSpan<T, TracableInfo> implements it.
type Span<'a> = LocatedSpan<&'a str, TracableInfo>;

// Apply tracable_parser by custom attribute
#[tracable_parser]
pub fn expr(s: Span) -> IResult<Span, String> {
    alt((expr_plus, expr_minus, term))(s)
}

#[tracable_parser]
pub fn expr_plus(s: Span) -> IResult<Span, String> {
    let (s, x) = term(s)?;
    let (s, y) = char('+')(s)?;
    let (s, z) = expr(s)?;
    let ret = format!("{}{}{}", x, y, z);
    Ok((s, ret))
}

#[tracable_parser]
pub fn expr_minus(s: Span) -> IResult<Span, String> {
    let (s, x) = term(s)?;
    let (s, y) = char('-')(s)?;
    let (s, z) = expr(s)?;
    let ret = format!("{}{}{}", x, y, z);
    Ok((s, ret))
}

#[tracable_parser]
pub fn term(s: Span) -> IResult<Span, String> {
    let (s, x) = term_internal(s)?;
    Ok((s, x))
}

#[tracable_parser]
pub fn term_internal(s: Span) -> IResult<Span, String> {
    let (s, x) = char('1')(s)?;
    Ok((s, x.to_string()))
}

fn main() {
    // Configure trace setting
    let info = TracableInfo::new().parser_width(64).fold("term");
    let ret = expr(LocatedSpan::new_extra("1-1+1+1-1", info));

    // Show histogram
    histogram();
    cumulative_histogram();
}

许可证

根据您选择以下任一许可证授权:

任选其一。

贡献

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双授权,不附加任何额外条款或条件。

依赖关系

~2.5MB
~56K SLoC