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
每月下载量 7,357
用于 23 个crate(6 个直接使用)
29KB
591 行
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
。
用法
[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 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,将按上述方式双授权,不附加任何额外条款或条件。
依赖关系
~2.5MB
~56K SLoC