pbrt_r3/core/parser/
remove_comment.rs

1use nom::bytes;
2use nom::character;
3
4use nom::sequence;
5use nom::IResult;
6
7pub fn remove_comment(s: &str) -> IResult<&str, String> {
8    let (rs, vs) = nom::combinator::all_consuming(nom::multi::many0(parse_one))(s)?;
9    return Ok((rs, vs.join("")));
10}
11
12fn parse_one(s: &str) -> IResult<&str, String> {
13    return nom::branch::alt((
14        parse_space1,
15        parse_string_literal,
16        parse_removed_comment,
17        parse_token,
18        parse_float,
19        parse_any,
20    ))(s);
21}
22
23fn parse_token(s: &str) -> IResult<&str, String> {
24    let (s, (a, b)) = nom::branch::permutation((
25        character::complete::alpha1,
26        bytes::complete::take_while(|c: char| c.is_alphanumeric() || c == '_'),
27    ))(s)?;
28    return Ok((s, format!("{}{}", a, b)));
29}
30
31fn parse_float(s: &str) -> IResult<&str, String> {
32    let (s, a) = nom::number::complete::recognize_float(s)?;
33    return Ok((s, a.to_string()));
34}
35
36fn parse_any(s: &str) -> IResult<&str, String> {
37    let (s, a) = character::complete::anychar(s)?;
38    return Ok((s, a.to_string()));
39}
40
41fn parse_space1(s: &str) -> IResult<&str, String> {
42    let (s, a) = character::complete::multispace1(s)?;
43    return Ok((s, a.to_string()));
44}
45
46fn parse_comment(s: &str) -> IResult<&str, &str> {
47    return sequence::preceded(
48        character::complete::char('#'),
49        bytes::complete::take_till(|c| c == '\n'),
50    )(s);
51}
52
53fn parse_removed_comment(s: &str) -> IResult<&str, String> {
54    let (s, _) = parse_comment(s)?;
55    return Ok((s, String::from("")));
56}
57
58fn parse_string_literal(s: &str) -> IResult<&str, String> {
59    let (s, a) = sequence::delimited(
60        character::complete::char('"'),
61        bytes::complete::take_until("\""),
62        character::complete::char('"'),
63    )(s)?;
64    return Ok((s, format!("{}{}{}", "\"", a, "\"")));
65}
66
67//----------------------------------------
68#[cfg(test)]
69mod tests {
70    use super::*;
71    #[test]
72    fn test_001() {
73        let s = "Integrator";
74        let (a, b) = parse_token(s).unwrap();
75        assert_eq!(a, "");
76        assert_eq!(b, "Integrator");
77    }
78
79    #[test]
80    fn test_002() {
81        let s = "Integrator ";
82        let (a, b) = parse_token(s).unwrap();
83        assert_eq!(a, " ");
84        assert_eq!(b, "Integrator");
85    }
86
87    #[test]
88    fn test_003() {
89        let s = "#hoge ";
90        let (a, b) = parse_removed_comment(s).unwrap();
91        assert_eq!(a, "");
92        assert_eq!(b, "");
93    }
94
95    #[test]
96    fn test_004() {
97        let s = "aaa llll";
98        let (a, b) = parse_token(s).unwrap();
99        assert_eq!(a, " llll");
100        assert_eq!(b, "aaa");
101    }
102
103    #[test]
104    fn test_005() {
105        let s = "\"aaa\" #1234\n aaa";
106        let (a, b) = (nom::multi::many0(parse_one)(s)).unwrap();
107        assert_eq!(a, "");
108        assert_eq!(b.len(), 5);
109        assert_eq!(b[0], "\"aaa\"");
110        assert_eq!(b[1], " ");
111        assert_eq!(b[2], "");
112    }
113
114    #[test]
115    fn test_006() {
116        let s = "\"aaa\" #1234\n aaa";
117        let (_, ss) = remove_comment(s).unwrap();
118        assert_eq!(ss, "\"aaa\" \n aaa");
119    }
120}