我在Unix上使用Flex制作词法分析器。如果你曾经使用过它,那么在你知道你主要只是为你正在编写Lexical Analyzer的任何语言的标记定义正则表达式时。我被困在最后一部分。我需要正确的Regex用于多行注释,允许类似
的内容/* This is a comment \*/
但也允许
/* This **** //// is another type of comment */
任何人都可以帮忙吗?
答案 0 :(得分:14)
您不能将C样式注释与Flex中的简单正则表达式匹配;它们需要基于起始状态的更复杂的匹配方法。 Flex FAQ说明了(好吧,他们对/*...*/
表单的处理方式;处理<INITIAL>
状态的其他表单应该很简单。
答案 1 :(得分:8)
但是,如果您只需要使用正则表达式,那么确实存在一个不太复杂的解决方案:
答案 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}/
的第二种类型