flex -L最长的模式匹配策略 - 不在这里



我有两个Lex规则,并且想知道为什么我从不匹配第二个规则。相反,规则1总是向模式发射2005-05-09-11.23.04.790000

<data>[-]?[0-9]*[.][0-9]*  { comma=0;
             printf("DEBUG: data 1 %sn",yytext);
                strcat(data_line,yytext); }
<data>[0-9]{4}[-][01][0-9][-][0-3][0-9][-][0-9]{2}[.][0-9]{2}[.][0-9]{2}[.][0-9]{6} {
printf("DEBUG: data 2[%s]n",yytext);
/* 1996-07-15-hh.00.00*/

我想,flex/lex会遵循最长的字符串匹配规则?

有趣的是,flex(没有-l lex兼容性)的行为"正确",至少因为我想表现。

这是与posix-/lex兼容性相关的几个" gotchas"之一[注1]。由于历史原因,即使Posix使用相同的缩写来描述Lex方言。

差异是支撑式重复操作员的优先级。在标准ER中,我知道的其他所有正则表达式都很好,abc{3}将与abccc匹配。除非您指定-l--posix标志,否则这也是通过Flex解释的方式。如果请求LEX兼容性,则支撑操作员的优先级比串联的优先级低于,因此abc{3}匹配abcabcabc

如果要编写将与Regex品种一起使用的Regexes,则必须将所有(或几乎全部)重复运算符的用途括起来。因此,您的第二种模式需要写为:

[0-9]{4}[-][01][0-9][-][0-3][0-9][-]([0-9]{2})[.]([0-9]{2})[.]([0-9]{2})[.]([0-9]{6})

编写的,它与指定的输入不匹配,而第一条规则将匹配领先年份。

对于它的价值,其他后缀重复运算符 - * - 在LEX中具有正常的高优势模式。(从某种意义上说,这种不一致使括号重复的行为更加令人困惑。)

lex模式中带有牙套的另一个陷阱是,当它们用作宏替换时,就不会添加隐式括号。所以在flex中:

foo     [fF][oO][oO]
%%
{foo}+  {
          /* yytext is some number of case-insensitive repetitions of foo */
        }

而在Lex兼容模式

foo     [fF][oO][oO]
%%
{foo}+  {
          /* yytext is an 'f' or 'F' followed by at least two 'o' or 'O's */
        }

注意:

  1. 我建议避免使用-l(和--posix)标志。仅在绝对必要时使用它们来编译为lex标准开发的旧代码。

相关内容

最新更新