pbrt_r3/core/parser/
remove_comment.rs1use 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#[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}