代码之家  ›  专栏  ›  技术社区  ›  mljli

flex正则表达式使用带有尾随上下文的{-}

  •  0
  • mljli  · 技术社区  · 9 年前

    我正在处理嵌套注释。我想一次跳过尽可能多的无关字符。但模式 <COMMENT>[^\n]{-}\//\*{-}\*/\/ 是非法的。有什么建议吗?

    使现代化 :
    鉴于以下情况:

    /**comment* text/**comment text**/comment*/
    

    在捕获第一个 /* ,它进入 COMMENT 条件现在我想吃掉尽可能多的角色(不是 /* */ )尽可能只匹配一次。由于flex选择最长的匹配,我不知道如何匹配孤立的 * s(不是 * 后面是 / )并隔离 / s、 而且 \//\* 不是字符类,因此我们无法计算它与另一个类之间的差异。

    1 回复  |  直到 9 年前
        1
  •  0
  •   gudok Nikola Radosavljević    9 年前
    %%
    "/\*"              { printf("OPEN_COMMENT [%s]\n", yytext); }
    "\*/"              { printf("CLOSE_COMMENT [%s]\n", yytext); }
    [^*/]+             { printf("TEXT [%s]\n", yytext); }
    "\*"               { printf("TEXT [%s]\n", yytext); }
    "/"                { printf("TEXT [%s]\n", yytext); }
    %%
    

    此处为最长匹配规则 帮助 我们想法是搭配独立式单人床 * / 符号分开使用,而所有其他文本都被大量使用(因此不会降低性能)。

    以上示例的结果:

    OPEN_COMMENT [/*]
    TEXT [*]
    TEXT [comment]
    TEXT [*]
    TEXT [ text]
    OPEN_COMMENT [/*]
    TEXT [*]
    TEXT [comment text]
    TEXT [*]
    CLOSE_COMMENT [*/]
    TEXT [comment]
    CLOSE_COMMENT [*/]
    TEXT [
    ]