使用lalrpop解析rust中由“引用的字符串

gk7wooem  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(203)

如何使用lalrpop解析rust中由“引用的字符串?

Str: Vec<u8> = {
    "\"" <s:r"([^\"])*"> "\"" => {
        s.bytes().collect()
    },
};

这不起作用,我试着把\放在不同的地方,但还没有弄清楚,因为文档中没有太多关于正则表达式的内容。

xnifntxz

xnifntxz1#

Lalrpop的documentation特别谈到了这一点:
如果你需要嵌入引号,你可以使用哈希,比如r#"..."..."#
在rust中,r"..."是一个原始字符串,这意味着所有非引号字符都按字面意思理解,包括\。原始字符串没有转义符,但是当你把r#"而不是r"放在开头时,字符串在找到"#之前不会结束。您可以对任意数量的#字符执行此操作,因此这些字符串都是相同的。

"hello"
r"hello"
r#"hello"#
r##"hello"##
r###"hello"###

这允许你转义任何",后面跟着任何数量的#,周围有足够的#符号。
这一切都是一个小的过度(和大多数事情)。对于正则表达式,您只需要一组周围的#,如文档所示,如下所示。

r#"([^"])*"#

但是,如果你想要一个排除"#的正则表达式,你可以这样做:

r##"([^"#])*"##

请注意,这样做是因为正则表达式经常使用大量的\,这会使转义变得烦人。你也可以把一个普通的字符串加上一个转义的引号(至少在rust中是这样,我还没有在lalrpop中尝试过)。

"([^\"])*"

相关问题