Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust Nom:输入的多个和结束_Rust_Nom - Fatal编程技术网

Rust Nom:输入的多个和结束

Rust Nom:输入的多个和结束,rust,nom,Rust,Nom,我正在尝试熟悉Nom,目前是版本5,其中没有CompleteStr和其他东西,因此相关问题没有太大帮助 我如何解析这样的内容 "@pook Some free text @another_pook And another text" 进入 ? @前缀字符串称为“字段标识符”; 下一个子串是描述; 两者都称为“字段” 以下是我如何成功解析一个字段: use nom::bytes::complete::take_while1; use nom::*; use nom::character::is_

我正在尝试熟悉Nom,目前是版本5,其中没有
CompleteStr
和其他东西,因此相关问题没有太大帮助

我如何解析这样的内容

"@pook Some free text @another_pook And another text"
进入

?

@
前缀字符串称为“字段标识符”; 下一个子串是描述; 两者都称为“字段”

以下是我如何成功解析一个字段:

use nom::bytes::complete::take_while1;
use nom::*;
use nom::character::is_alphabetic;

fn ident(c: char) -> bool {
    is_alphabetic(c as u8) || c == '_'
}

fn freetext(c: char) -> bool {
    c != '@'
}

fn parse_ident(s: &str) -> IResult<&str, &str> {
    take_while1(ident)(s)
}

fn parse_freetext(s: &str) -> IResult<&str, &str> {
    take_while1(freetext)(s)
}


named! {field_ident<&str, &str>,
    do_parse!(
        tag!("@") >>
        name: parse_ident >>
        (name)
    )
}

named! { field <&str, (&str, &str)>,
    do_parse!(
        name: ws!(field_ident) >>
        description: parse_freetext >>
        (name, description)
    )
}
使用nom::bytes::complete::take_while1;
使用名称::*;
使用名称::字符::是字母;
fn标识(c:char)->bool{
是字母(c为u8)| c==''
}
fn freetext(c:char)->bool{
c!='@'
}
fn parse_ident(s:&str)->IResult{
抽空1(识别)(s)
}
fn parse_freetext(s:&str)->IResult{
take__while1(自由文本)(s)
}
命名!{字段标识,
别客气(
标签!(“@”)>>
名称:parse_ident>>
(姓名)
)
}
命名!{字段,
别客气(
名称:ws!(字段识别)>>
说明:解析\u freetext>>
(姓名、描述)
)
}

当我将其包装成
many1
并按照开头所述提供输入时,我会收到
Err(不完整(大小(1))
,但如果我将
@
放在输入的末尾,它就会起作用。如何在输入结束时将其标记为已完成?

您想要的是
many\u-till
combinator,而不是
many1
,如下所示:

使用nom::bytes::complete::take_while1;
使用名称::字符::是字母;
使用名称::*;
fn标识(c:char)->bool{
是字母(c为u8)| c==''
}
fn freetext(c:char)->bool{
c!='@'
}
fn parse_ident(s:&str)->IResult{
抽空1(识别)(s)
}
fn parse_freetext(s:&str)->IResult{
take__while1(自由文本)(s)
}
命名!{字段标识,
别客气(
标签!(“@”)>>
名称:parse_ident>>
(姓名)
)
}
命名!{字段,
别客气(
名称:ws!(字段识别)>>
说明:解析\u freetext>>
(姓名、描述)
)
}
命名!(字段,许多直到!(字段,eof!());
fn main(){
println!(“{:?}”,字段(“@pook Some free text”);
普林顿(
"{:?}",
字段(“@pook Some free text@other_pook And other text”)
);
}

有点违反直觉。我想这与nom的流媒体性质有关。

谢谢。我试过了,现在犯了一些错误。我将重写函数以实现“流式传输特性”。更新答案以包含完整的源代码。它对我有用。哦,我的糟糕,我最后留下了
@
,现在它有用了,谢谢!
use nom::bytes::complete::take_while1;
use nom::*;
use nom::character::is_alphabetic;

fn ident(c: char) -> bool {
    is_alphabetic(c as u8) || c == '_'
}

fn freetext(c: char) -> bool {
    c != '@'
}

fn parse_ident(s: &str) -> IResult<&str, &str> {
    take_while1(ident)(s)
}

fn parse_freetext(s: &str) -> IResult<&str, &str> {
    take_while1(freetext)(s)
}


named! {field_ident<&str, &str>,
    do_parse!(
        tag!("@") >>
        name: parse_ident >>
        (name)
    )
}

named! { field <&str, (&str, &str)>,
    do_parse!(
        name: ws!(field_ident) >>
        description: parse_freetext >>
        (name, description)
    )
}