Unix Flex Regex用于多行注释

时间:2011-01-21 06:15:15

标签: regex unix flex-lexer

我在Unix上使用Flex制作词法分析器。如果你曾经使用过它,那么在你知道你主要只是为你正在编写Lexical Analyzer的任何语言的标记定义正则表达式时。我被困在最后一部分。我需要正确的Regex用于多行注释,允许类似

的内容
/* This is a comment \*/

但也允许

/* This **** //// is another type of comment */

任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:14)

您不能将C样式注释与Flex中的简单正则表达式匹配;它们需要基于起始状态的更复杂的匹配方法。 Flex FAQ说明了(好吧,他们对/*...*/表单的处理方式;处理<INITIAL>状态的其他表单应该很简单。

答案 1 :(得分:8)

但是,如果您只需要使用正则表达式,那么确实存在一个不太复杂的解决方案:


&#34; / *&#34;([^ *] |(\ * + [^ * /]))* \ * + \ / 正如here所述,对该正则表达式的充分解释和推导得到了很好的阐述 简而言之:
  • &#34; / *&#34;标志着评论的开始
  • ([^ *] |(\ * + [^ * /]))*表示接受所有不是*([^ *])的字符或接受一个或多个*的序列为只要序列没有&#39; *&#39;或者一个/&#39;跟着它((* + [^ * /]))。这意味着除了***** /之外,所有****** ...序列都将被接受,因为你无法找到*之后没有*或者a的序列/。
  • ******* / case然后由RegEx的最后一位处理,它匹配任意数量的*后跟一个/来标记注释的结尾,即\ * + \ /

  • 答案 2 :(得分:0)

    http://www.lysator.liu.se/c/ANSI-C-grammar-l.html

    "/*"            { comment(); }
    
    comment() {
        char c, c1;
    
    loop:
        while ((c = input()) != '*' && c != 0)
            putchar(c);
    
        if ((c1 = input()) != '/' && c != 0) {
            unput(c1);
            goto loop;
        }
    
        if (c != 0)
            putchar(c1);
    }
    

    也可以解决这个问题的问题是How do I write a non-greedy match in LEX / FLEX?

    答案 3 :(得分:-2)

    我不知道flex,但我确实知道正则表达式。 /\/\*.*?\*\//s应匹配两种类型(在PCRE中),但如果您需要在分析器中区分它们,则可能需要迭代匹配列表以查看它们是否为/\*\*\s+\/{4}/的第二种类型