使用解析器组合器解析带有转义字符的字符串?

弗雷德里克

我试图用结合库锈解析字符串。我要解析的真实数据看起来像这样:

A79,216,0,4,2,2,N,"US\"PS"

因此,该数据的末尾是带引号的字符串,但是该字符串也将包含转义字符。我不知道如何解析其他引号之间的转义字符。

extern crate parser_combinators;

use self::parser_combinators::*;

fn main() {
    let s = r#""HE\"LLO""#;
    let data = many(satisfy(|c| c != '"')); // Fails on escaped " obviously
    let mut str_parser = between(satisfy(|c| c == '"'), satisfy(|c| c == '"'), data);
    let result : Result<(String, &str), ParseError> = str_parser.parse(s);
    match result {
        Ok((value, _)) => println!("{:?}", value),
        Err(err) => println!("{}", err),
    }
}

//=> "HE\\"

上面的代码将成功解析该字符串,但显然在中间的转义字符上将失败,并"HE\\"在最后输出。

我想更改上面的代码,以便打印出来"HE\\\"LLO"

我怎么做?

三月

我有一个功能最强大的JSON解析器作为解析器组合器的基准,该解析器组合器解析了这种转义字符。我在下面提供了指向它的链接和略微简化的版本。

fn json_char(input: State<&str>) -> ParseResult<char, &str> {
    let (c, input) = try!(satisfy(|c| c != '"').parse_state(input));
    let mut back_slash_char = satisfy(|c| "\"\\nrt".chars().find(|x| *x == c).is_some()).map(|c| {
        match c {
            '"' => '"',
            '\\' => '\\',
            'n' => '\n',
            'r' => '\r',
            't' => '\t',
            c => c//Should never happen
        }
    });
    match c {
        '\\' => input.combine(|input| back_slash_char.parse_state(input)),
        _    => Ok((c, input))
    }
}

json_char

由于此解析器可能消耗1或2个字符,因此使用原始组合器是不够的,因此我们需要引入一个可以在所解析的字符上分支的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章