如何理解 flex C/C++ 字符串文字正则表达式?

How to understand the flex C/C++ string literal regex?

我正在学习flex/bison解析技术。 Book flex & bison 展示了这样一个 flex 示例:


UCN (\u[0-9a-fA-F]{4}|\U[0-9a-fA-F]{8})

{%
...
%}

%%

\"([^\"\]|\['"?\abfnrtv]|\[0-7]{1,3}|\[Xx][0-9a-fA-F]+|{UCN})+\" { ... save token here }

%%

我不知道正则表达式中的这些部分:

  1. [^\"\]是否表示不匹配\"\?如果是这样,为什么需要指定此 不匹配 ?因为 \"\ 似乎没有出现在另一组中。
  2. \[0-7]{1,3} 是什么意思?
  3. \[Xx][0-9a-fA-F] 是什么意思?
  4. UCN 是指 utf-8 吗?
  1. [^...] 表示匹配任何单个元素 not ...

  2. \[0-7]{1,3} 表示匹配 \ 后跟 0-7 集合中的一到三个字符(匹配不必是相同的字符,例如匹配“\123” )

  3. \[Xx][0-9a-fA-F] 表示匹配 \ 后跟 x 或 X 后跟集合 0-9a-fA-F

    [=31= 中的字符]
  4. UCN 是 lex 自定义定义的示例,此类定义允许以后重复使用正则表达式模式,而无需复制整个模式;相反,它可以只包含在大括号 {UCN}

我建议你找到 material 关于正则表达式,如果前三个真的很混乱,flex 手册可以告诉你定义:https://www.cs.virginia.edu/~cr4bd/flex-manual/Definitions-Section.html#Definitions-Section

该正则表达式匹配以下内容:

  • 一个"个字符,
  • 后跟以下一项或多项的任意组合:
    • [^\"\] - "\
    • 以外的任何字符
    • \['"?\abfnrtv] - \ 后跟 '"?\a 中的任何一个, b, f, n, r, t, 或 v.
    • \[0-7]{1,3} - \ 后跟一到三个八进制数字。
    • \[Xx][0-9a-fA-F]+ - \ 后跟 Xx 后跟一个或多个十六进制数字。
    • {UCN},扩展为 (\u[0-9a-fA-F]{4}|\U[0-9a-fA-F]{8}) - 以下任意一项:
      • \u[0-9a-fA-F]{4} - \ 后跟 u 后跟四个十六进制数字
      • \U[0-9a-fA-F]{8} - \ 后跟 U 后跟八个十六进制数字
  • 后跟结束 " 个字符

请注意,这实际上不是匹配所有 C++ 字符串文字的正确模式,因为

  • 不匹配空字符串("")
  • 十六进制转义码必须以小写 x 开头。匹配这些的更好模式是 \x[0-9a-fA-F]+

有关所有 C++ 转义序列含义的详细信息,请参阅 this page

回答您的具体问题:

  1. \ 表示转义序列,由其他选项处理,未转义的 " 表示字符串文字的结尾。通用 "any character" 匹配不匹配这些字符中的任何一个,因此它们可以与表达式的其他部分匹配。
  2. 上面回答:\[0-7]{1,3}表示一个\后跟一到三个八进制数。
  3. 上面回答:\[Xx][0-9a-fA-F]+表示\后跟[=​​31=]或x后跟一个或多个十六进制数字
  4. UCN 是通用字符名称的缩写。它表示一个 Unicode 字符,但没有说明其编码。