代码之家  ›  专栏  ›  技术社区  ›  James K. Lowden

flex模式中的空白导致“无法识别的规则”

  •  0
  • James K. Lowden  · 技术社区  · 7 年前

    flex info手册允许在正则表达式中使用 (?r-s:pattern)

    (?:foo)         same as  (foo)
    

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   rici    7 年前

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

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

    事实上,这是行不通的。虽然可以在模式中使用扩展格式,但只有在不包含换行符的定义中才能使用它。定义在定义行的最后一个非空白字符处终止。

    不管怎样,定义被过度使用了。你可以这样写

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

    我知道你可能想在规则中使用一个很长的模式,这很尴尬,特别是如果你想使用它两次。不管换行符有什么问题,这都会遇到Flex定义长度限制(2047个字符)的问题。我的方法是将很长的模式分解成一系列的定义,然后定义另一个连接这些片段的符号。

    在v2.6之前,Flex没有切掉定义行末尾的空白,这也导致了神秘的“未识别规则”错误。该手册似乎仍然反映了v2.5的行为:

    定义从名称后面的第一个非空白字符开始,一直到行尾。

    推荐文章