Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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 如何实现take_-until_和_-consume-like解析器组合器,它不会跳过标记?_Rust_Nom - Fatal编程技术网

Rust 如何实现take_-until_和_-consume-like解析器组合器,它不会跳过标记?

Rust 如何实现take_-until_和_-consume-like解析器组合器,它不会跳过标记?,rust,nom,Rust,Nom,我想编写一个nom解析器组合器,它最多占用一个标记序列并包含一个标记序列。我试着使用take_直到_和_消费,但我发现生成的解析器组合器丢弃了标记序列: #[macro_use] extern crate nom; named!(up_to_and_including_backslash, take_until_and_consume!("\\")); fn main() { let res = up_to_and_including_backslash(b" \\");

我想编写一个nom解析器组合器,它最多占用一个标记序列并包含一个标记序列。我试着使用
take_直到_和_消费,但我发现生成的解析器组合器丢弃了标记序列:

#[macro_use]
extern crate nom;

named!(up_to_and_including_backslash, take_until_and_consume!("\\"));

fn main() {
    let res = up_to_and_including_backslash(b"    \\");
    println!("{:?}", res);
}
结果:

Done([],[32,32,32,32])
我希望在结果中包含标记序列(在本例中为反斜杠字符):

Done([],[32,32,32,32,92])

我怎样才能做到这一点呢?

现在您正在使用的方法是
take\u till\u和\u consume
,其文档中说明:

在指定的字节序列之前生成一个使用字节的解析器 被发现,并消耗它

消费部分很重要,因为这是你想要避免的

你可以做类似的事情:

named!(up_to_and_including_backslash,
    do_parse!(
        line: take_until!("\\") >> char!('\\') >>
        (line)
    )
);

这将返回带有分隔符的行。

更新:
您要使用
识别打开
拿着你直到你和你消费!(“\\”)
将消耗的所有内容添加到输出中

您可以这样编写解析器函数:

#[macro_use]
extern crate nom;

named!(up_to_and_including_backslash, recognize!( take_until_and_consume!("\\") ));

fn main() {
    let res = up_to_and_including_backslash(b"    \\");
    println!("{:?}", res);
}
如果您需要将多个解析器使用的符号包含到输出中,您可以将它们全部放入
do_parse
内识别。像这样:

recognize!( do_parse!( tag!("\\") >> take_until_and_consume!("\\") >> take!(4) >> () ) )
旧版:
我唯一能让它工作的方法就是这个丑陋可憎的东西

命名!(最多为和,包括反斜杠,
别客气(
行:服用直到你和你消费!(“\\”>>
(
{ 
让mut完成_-line:Vec=line.to_-Vec();
完成\u线。从\u片(b“\\”)延伸\u;
&*完整线
}
)
)
);

我尝试了您提出的解决方案,但结果仍然是
完成([],[32,32,32,32])
named!(up_to_and_including_backslash,
    do_parse!(
        line: take_until_and_consume!("\\") >>
        (
            { 
                let mut complete_line:Vec<u8> = line.to_vec();
                complete_line.extend_from_slice(b"\\");
                &*complete_line
            }
        )
    )
);