弹性模式中的空格导致 "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.
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.