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
8,541 每月下载量
在 24 个 crate 中使用 (通过 nom-tracable)
4KB
52 行
nom-tracable
nom 的跟踪解析器扩展。
功能
- 以彩色格式跟踪解析器
- 前向/后向调用计数
- 折叠特定解析器
- 解析器调用计数的直方图/累积直方图
- 跟踪禁用时无开销
要求
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
。
注意: T
在 nom_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,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确声明,否则您按照Apache-2.0许可证定义的方式有意提交并包含在工作中的任何贡献,都将按上述方式双授权,不附加任何额外的条款或条件。
依赖项
~1.5MB
~35K SLoC