6个版本 (破坏性)

0.5.1 2024年3月28日
0.5.0 2023年3月23日
0.4.0 2021年8月31日
0.3.0 2020年11月26日
0.1.1 2019年8月15日

#521解析器实现

Download history 520/week @ 2024-04-23 648/week @ 2024-04-30 464/week @ 2024-05-07 467/week @ 2024-05-14 735/week @ 2024-05-21 633/week @ 2024-05-28 555/week @ 2024-06-04 535/week @ 2024-06-11 429/week @ 2024-06-18 426/week @ 2024-06-25 221/week @ 2024-07-02 431/week @ 2024-07-09 829/week @ 2024-07-16 625/week @ 2024-07-23 581/week @ 2024-07-30 413/week @ 2024-08-06

每月2,527次下载
10 个crate中使用(通过 sv-parser-parser

MIT/Apache

9KB
101

nom-recursive

nom的扩展,用于处理左递归。

Actions Status Crates.io Docs.rs

要求

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

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

或者您可以使用nom_locate::LocatedSpan<T, RecursiveInfo>。这在此crate中实现了HasRecursiveInfo

用法

[dependencies]
nom-recursive = "0.5.1"

示例

use nom::branch::*;
use nom::character::complete::*;
use nom::IResult;
use nom_locate::LocatedSpan;
use nom_recursive::{recursive_parser, RecursiveInfo};

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

pub fn expr(s: Span) -> IResult<Span, String> {
    alt((expr_binary, term))(s)
}

// Apply recursive_parser by custom attribute
#[recursive_parser]
pub fn expr_binary(s: Span) -> IResult<Span, String> {
    let (s, x) = expr(s)?;
    let (s, y) = char('+')(s)?;
    let (s, z) = expr(s)?;
    let ret = format!("{}{}{}", x, y, z);
    Ok((s, ret))
}

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

fn main() {
    let ret = expr(LocatedSpan::new_extra("1+1", RecursiveInfo::new()));
    println!("{:?}", ret.unwrap().1);
}

许可证

根据您的选择,许可如下:

贡献

除非您明确表示,否则根据Apache-2.0许可证定义,您提交的任何旨在包含在本作品中的贡献都应如上所述双重许可,而不附加任何额外的条款或条件。

依赖关系

~2.5MB
~56K SLoC