【问题标题】:flex's parttern match modeflex 的模式匹配模式
【发布时间】:2014-10-03 03:13:03
【问题描述】:

最近,我正在使用 flex 做一些词法分析工作,我对 flex 完全陌生。考虑以下情况,我有一个多行注释来进行模式匹配,

/**
 * 
 * multiline comment
 * 
 */

在 flex 中,正则表达式:

\/\*.*\*\/

不匹配这个多行注释,而只匹配一个单行注释,例如:

/** single comment **/

所以,似乎 flex 的模式匹配是“单行模式”,就像 grep 一样,对吗?

【问题讨论】:

    标签: regex flex-lexer


    【解决方案1】:

    还有这个:

    \/\*[\s\S]*\*\/
    

    explanation

    【讨论】:

    • 虽然one line answers 是可以接受的,但它们通常会导致答案被发送到审核队列 (q.v.)。此外,有时他们并没有受到社区的欢迎。提供一个简短的解释来解释答案如何解决问题通常是个好主意。
    • Flex 没有实现 \s\S 转义。见Flex manual
    【解决方案2】:

    匹配多行 C/C++ cmets 的正确 Flex 模式是:(取自 this answer

    [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
    

    Flex 不提供非贪婪重复运算符,因此上面是最简单的正则表达式,它在第一次关闭*/ 时停止。或者,您可以使用开始条件(改编自 Flex manual):

    %x comment
    %%
    
    "/*"                    BEGIN(comment);
    
    <comment>[^*]*          /* eat anything that's not a '*' */
    <comment>"*"+"/"        BEGIN(INITIAL);
    <comment>"*"+           /* eat up '*'s not followed by a '/' */
    <comment><<EOF>>        { yyerror("Unterminated comment"); 
                              return 0;
                            }
    

    【讨论】:

      【解决方案3】:
      Flex 中的

      . 匹配任何字符除了换行符,因此请改用(.|\n)*。以您为例:

      \/\*(.|\n)*\*\/
      

      【讨论】:

      • 这将从第一个 /* 评论的开头匹配到最后一个此类评论的结尾。 Flex 没有实现非贪婪匹配,所以没有简单的修复方法。
      猜你喜欢
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2011-01-16
      • 2020-04-29
      • 1970-01-01
      • 2016-05-17
      • 2022-01-12
      相关资源
      最近更新 更多