在Flex中匹配`\`

时间:2014-06-29 06:34:17

标签: c++ compiler-construction flex-lexer lexical-analysis

我正在尝试在flex中创建一个简单的状态机,它必须确保跨越多行的字符串必须具有\换行符。具体地:

"this is \
ok"

"this is not
ok"

第一个是有效的。第二个不是。

我有以下状态机:

expectstring     BEGIN(expectstr);
<expectstr>[^\n]     {num_lines++;}
<expectstr>\         {flag = true;}
<expectstr>\n        {printf("%s\n", flag ? "True" : False);}

但是当我尝试编译这个状态机时,flex告诉我\的规则无法匹配。那是为什么?

我看过this,但无法理解。

1 个答案:

答案 0 :(得分:1)

在flex中,以下模式匹配换行符以外的任何内容:

.

您也可以将其写为

[^\n]

更为正常。

为了匹配反斜杠,你可以写

\\
"\\"
[\\]

同样,第一种是通常的方式。

了解[...]是一种表示一组字符的方式很重要,并且大多数正则表达式运算符只是括号内的普通字符。类似地,"..."是表示字符序列的一种方式,大多数正则表达式运算符只是引号内的普通字符。

因此,

  • [a|b]匹配一个字符,如果它是 a | b
  • "a|b"匹配三个字符的序列 a | b
  • and|but匹配任意三个字符的序列 a n

d b u t 由于flex允许您匹配正则表达式,因此您根本不需要手动构建状态机。只需使用适当的正则表达式。例如,以下内容将匹配以&#34; 开头和结尾的字符串,其中 \ 可用于转义自身以及换行符,以及换行符(除了逃脱的)是非法的。我认为这是你的目标。

\"([^"\n\\]|\\(.|\n))*\"

你应该确保你理解它的运作方式;互联网上的正则表达式有很多很好的解释(更糟糕的是,所以试着找一个知道他们在说什么的人写的)。这是摘要:

\"     A literal double-quote
(...)* Any number of repetitions of:
  [^"\n\\]   Anything other than a double-quote, newline, or backslash
  |          Or
  \\         A literal backslash, followed by
  (...)      Grouping
    .          Anything other than a newline
    |          Or
    \n         a newline