如何在Rust中使用LALRPOP解析双引号包裹的字符串?
在Rust中用LALRPOP正确解析双引号包裹的字符串
你的代码无法运行核心问题在于正则的转义处理和匹配逻辑有问题,以下是两种场景下的正确实现:
场景1:解析不含转义双引号的普通字符串
如果只需要匹配不包含双引号的简单字符串,用r#"..."#原始字符串语法避免转义冲突,正则直接排除双引号即可:
Str: Vec<u8> = { "\"" <s:r#"[^"]*"#> "\"" => s.bytes().collect(), };
场景2:解析包含转义双引号的字符串(如"hello \"world\"")
如果要支持字符串内部的转义双引号,正则需要同时匹配转义序列和非特殊字符,写法如下:
Str: Vec<u8> = { "\"" <s:r#"(\\.|[^"\\])*"#> "\"" => s.bytes().collect(), };
正则逻辑说明:
\\.:匹配任意转义序列(比如\"、\\等),第一个\是Rust原始字符串的转义,第二个\是正则里的转义符,.匹配任意字符。[^"\\]:匹配既不是双引号也不是反斜杠的普通字符。- 两者用
|组合后加*,表示可以重复任意次数,覆盖所有合法的字符串内容。
原代码的问题:
- 在LALRPOP的正则中,
[^"]不需要额外转义双引号,多余的\会导致正则匹配错误。 - 没有处理转义双引号的情况,遇到带
\"的字符串会直接终止解析。
内容的提问来源于stack exchange,提问作者Malik Ammar Faisal
相关产品推荐
相关产品推荐

