Revision control
Copy as Markdown
Other Tools
use nom::{IResult, Parser};
pub(crate) fn sp(input: &str) -> IResult<&str, &str> {
nom::combinator::recognize(nom::multi::many0(nom::branch::alt((
// ignores line comments
nom::combinator::value(
(),
nom::sequence::tuple((
nom::bytes::complete::tag("//"),
nom::combinator::not(nom::bytes::complete::tag("/")),
nom::bytes::complete::take_until("\n"),
nom::bytes::complete::tag("\n"),
)),
),
// ignores whitespace
nom::combinator::value((), nom::character::complete::multispace1),
// ignores block comments
nom::combinator::value(
(),
nom::sequence::tuple((
nom::bytes::complete::tag("/*"),
nom::bytes::complete::take_until("*/"),
nom::bytes::complete::tag("*/"),
)),
),
))))(input)
}
/// ws also ignores line & block comments
pub(crate) fn ws<'a, F>(inner: F) -> impl FnMut(&'a str) -> IResult<&str, &str>
where
F: Parser<&'a str, &'a str, nom::error::Error<&'a str>>,
{
nom::sequence::delimited(sp, inner, sp)
}