Parsing 使用nom解析多行注释
我正在尝试编写一个识别多行注释的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: &'
/*
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"))
);