flex信息手册使用(?r-s:pattern)
形式的“ x”修饰符提供了允许在正则表达式中使用空格的功能。它专门提供了一个简单的示例(没有空格)
(?:foo) same as (foo)
,但是以下程序无法编译,并显示错误“无法识别的规则”:
BAD (?:foo)
%%
{BAD} {}
我找不到可接受的任何形式的(?
作为规则模式。手册是否有误,还是我误会了?
答案 0 :(得分:1)
您的问题中的示例似乎并未反映问题本身,因为它既未显示空格也未显示x
标志。所以我将假设对您来说失败的模式是
BAD (?x:two | lines |
of | words)
%%
{BAD} { }
确实,这将行不通。尽管您可以在模式中使用扩展格式,但是如果它不包含换行符,则只能在定义中使用它。定义终止于定义行上的最后一个非空白字符。
无论如何,定义都被过度使用了。您可以将上面的代码写为
%%
(?x:two | lines |
of | words ) { }
这使阅读您的代码的任何人都不必搜索定义。
我确实知道您可能希望在规则中使用很长的模式,这很尴尬,尤其是如果您想使用两次。不管换行符是什么问题,这都会遇到Flex的定义长度限制(2047个字符)的问题。我的方法是将很长的模式分解为一系列定义,然后定义另一个将各部分连接起来的符号。
在v2.6之前,Flex并未在定义行的末尾截断空格,这还会导致神秘的“无法识别的规则”错误。该手册似乎仍然反映了v2.5的行为:
该定义从名称后的第一个非空白字符开始,一直到该行的末尾。