17 个不稳定版本

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日

#113#trace

Download history 6104/week @ 2024-03-14 2270/week @ 2024-03-21 2435/week @ 2024-03-28 2170/week @ 2024-04-04 2188/week @ 2024-04-11 2294/week @ 2024-04-18 2416/week @ 2024-04-25 2761/week @ 2024-05-02 2097/week @ 2024-05-09 2372/week @ 2024-05-16 2092/week @ 2024-05-23 2440/week @ 2024-05-30 2121/week @ 2024-06-06 2308/week @ 2024-06-13 2222/week @ 2024-06-20 1362/week @ 2024-06-27

8,541 每月下载量
24 个 crate 中使用 (通过 nom-tracable)

MIT/Apache

4KB
52

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 实现了 Tracablenom_locate::LocatedSpan<T, TracableInfo> 中的 T 必须实现 FragmentDisplay。在这个 crate 中,&str&[u8] 实现了它。如果您想使用另一个类型作为 T,您应该为它实现 FragmentDisplay

注意: Tnom_locate::LocatedSpan<T, TracableInfo> 中必须实现 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许可证定义的方式有意提交并包含在工作中的任何贡献,都将按上述方式双授权,不附加任何额外的条款或条件。

依赖项

~1.5MB
~35K SLoC