Parsing 使用nom解析多行注释

Parsing 使用nom解析多行注释,parsing,rust,nom,Parsing,Rust,Nom,我正在尝试编写一个识别多行注释的nom解析器 /* yo! */ …并消耗/丢弃(相同的东西,对吗?)结果: use nom::{ bytes::complete::{tag, take_until}, error::{ErrorKind, ParseError}, sequence::preceded, IResult, }; fn multiline_comment<'a, E: ParseError<&'a str>>(i: &'

我正在尝试编写一个识别多行注释的nom解析器

/*
yo!
*/
…并消耗/丢弃(相同的东西,对吗?)结果:

use nom::{
  bytes::complete::{tag, take_until},
  error::{ErrorKind, ParseError},
  sequence::preceded,
  IResult,
};

fn multiline_comment<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
    preceded(tag("/*"), take_until("*/"))(i)
}
给出了结果

thread 'should_consume_multiline_comments' panicked at 'assertion failed: `(left == right)`
left: `Ok(("*/", "abc\n\ndef"))`,
right: `Ok(("", "/*abc\n\ndef*/"))`'
所以我的问题是,如何获得完整的评论,包括结尾
*/


谢谢

我假设您不希望返回的字符串前面的
/*
和结尾的
*/
都保持完整-因为
前面的
总是丢弃第一个解析器中的匹配,所以使用
前面的
永远不会得到它。我认为您主要关心的是确保结账时的
*/
被实际使用

为此,您可以使用分隔的
而不是前面的

fn multiline_comment<'a, E: ParseError<&'a str>>(i: &'a str) -> IResult<&'a str, &'a str, E> {
    delimited(tag("/*"), is_not("*/"), tag("*/"))(i)
}
fn多行注释>(i:&'a str)->IResult{
带分隔符(标记(“/*”),不是(“*/”),标记(“*/”))(i)
}
这通过了这个测试:

assert_eq!(
    multiline_comment1::<(&str, ErrorKind)>("/*abc\n\ndef*/"),
    Ok(("", "abc\n\ndef"))
);
assert\u eq!(
多行注释1::(“/*abc\n\ndef*/”,
正常((“”,“abc\n\ndef”))
);

因此,您可以确定关闭的
*/
已被使用。

您是正确的,我并不真正想要打开和关闭的/*…*/。我只是想让解析器使用注释并丢弃它。非常感谢。
assert_eq!(
    multiline_comment1::<(&str, ErrorKind)>("/*abc\n\ndef*/"),
    Ok(("", "abc\n\ndef"))
);