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 在 解析器实现
每月2,527次下载
在 10 个crate中使用(通过 sv-parser-parser)
9KB
101 行
nom-recursive
nom的扩展,用于处理左递归。
要求
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版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确表示,否则根据Apache-2.0许可证定义,您提交的任何旨在包含在本作品中的贡献都应如上所述双重许可,而不附加任何额外的条款或条件。
依赖关系
~2.5MB
~56K SLoC