弹性模式中的空格导致 "unrecognized rule"

whitespace in flex patterns leads to "unrecognized rule"

flex 信息手册允许使用 (?r-s:pattern) 形式的 "x" 修饰符在正则表达式中使用空格。它专门提供了一个简单的例子(没有空格)

(?:foo)         same as  (foo)

但以下程序无法编译并出现错误 "unrecognized rule":

BAD (?:foo)
%%
{BAD} {}

我找不到任何形式的 (? 可以作为规则模式接受。是手册有误,还是我理解有误?

你问题中的例子似乎并没有反映问题本身,因为它既没有显示空格的使用也没有显示 x 标志。所以我假设你失败的模式是

BAD      (?x:two | lines | 
             of | words)
%%
{BAD}    { }

事实上,那是行不通的。尽管您可以在模式中使用扩展格式,但如果它不包含换行符,则只能在定义中使用它。定义在定义行的最后一个非空白字符处终止。

无论如何,定义被滥用了。你可以把上面写成

%%
(?x:two | lines |
    of | words )     { }

这样一来,阅读您的代码的任何人都不必搜索定义。

我知道您可能想在规则中使用很长的模式,这很尴尬,尤其是当您想使用它两次时。不管换行符的问题如何,这往往 运行 导致 Flex 的定义长度限制(2047 个字符)出现问题。我的方法是将很长的模式分解为一系列定义,然后定义另一个连接这些片段的符号。

在 v2.6 之前,Flex 没有将定义行末尾的空格去掉,这也会导致神秘的 "unrecognized rule" 错误。该手册似乎仍然反映了 v2.5 的行为:

The definition is taken to begin at the first non-whitespace character following the name and continuing to the end of the line.