diff --git a/src/lib/parser/mod.rs b/src/lib/parser/mod.rs index 22e0b935..0c9a56fc 100644 --- a/src/lib/parser/mod.rs +++ b/src/lib/parser/mod.rs @@ -1037,17 +1037,7 @@ pub fn parse_string(input: Parser) -> Res { tuple(( parse_identity, terminated(tag("\""), space0), - recognize(many0(escaped_transform( - none_of("\\\'\"\n\r"), - '\\', - alt(( - value("\\", tag("\\")), - value("\'", tag("\'")), - value("\"", tag("\"")), - value("\n", tag("n")), - value("\r", tag("r")), - )), - ))), + recognize(many0(parse_escaped_char)), tag("\""), )), |(node_id, _, s, _)| { @@ -1059,6 +1049,34 @@ pub fn parse_string(input: Parser) -> Res { )(input) } +pub fn parse_escaped_char(input: Parser) -> Res { + map( + escaped_transform( + none_of("\\\'\"\n\r\0"), + '\\', + alt(( + value("\\", tag("\\")), + value("\'", tag("\'")), + value("\"", tag("\"")), + value("\n", tag("n")), + value("\r", tag("r")), + value("\0", tag("0")), + )), + ), + |c| unescape(&c).unwrap().chars().next().unwrap(), + )(input) +} + +pub fn parse_char(input: Parser) -> Res { + map( + tuple(( + parse_identity, + delimited(tag("'"), parse_escaped_char, tag("'")), + )), + |(node_id, c)| Literal::new_char(c, node_id), + )(input) +} + pub fn parse_array(input: Parser) -> Res { map( tuple(( @@ -1125,23 +1143,6 @@ pub fn parse_number(input: Parser) -> Res { Ok((input, Literal::new_number(num, node_id))) } -pub fn parse_char(input: Parser) -> Res { - let esc = escaped_transform( - none_of("\\\'"), - '\\', - alt(( - value("\\", tag("\\")), - value("\'", tag("\'")), - value("\n", tag("n")), - )), - ); - - let res = delimited(tag("'"), esc, tag("'")); - - map(tuple((parse_identity, res)), |(node_id, s)| { - Literal::new_char(s.chars().nth(0).unwrap(), node_id) - })(input) -} // Types pub fn parse_signature(input: Parser) -> Res {