Regex flex';s部件匹配模式

Regex flex';s部件匹配模式,regex,flex-lexer,Regex,Flex Lexer,最近,我正在使用flex做一些词法分析工作,我对flex完全陌生。考虑下面的情况,我有一个多行注释来进行模式匹配, /** * * multiline comment * */ 在flex中,正则表达式: \/\*.*\*\/ 不匹配此多行注释,但只匹配一行注释,如: /** single comment **/ 因此,flex的模式匹配似乎和grep一样是“单线模式”,对吗?这样: \/\*[\s\S]*\*\/ 在Flex中匹配除换行符以外的任何字符,因此请改用(.|\n

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

/**
 * 
 * multiline comment
 * 
 */
在flex中,正则表达式:

\/\*.*\*\/
不匹配此多行注释,但只匹配一行注释,如:

/** single comment **/
因此,flex的模式匹配似乎和grep一样是“单线模式”,对吗?

这样:

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

在Flex中匹配除换行符以外的任何字符,因此请改用
(.|\n)*
。例如:

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

匹配多行C/C++注释的一个正确的Flex模式是:(摘自)

Flex不提供非贪婪重复运算符,因此上面是最简单的正则表达式,在第一次关闭时停止。或者,您可以使用启动条件(根据以下条件进行调整):

%x注释
%%
“/*”开始(注释);
[^*]*/*吃任何不是'*'的东西*/
“*”+“/”开始(首字母);
“*”+/*吃掉“*”后没有“/”字符*/
{yyerror(“未终止的注释”);
返回0;
}

虽然答案是可以接受的,但它们通常会导致答案被路由到审查队列(q.v.)。此外,他们有时也不太受社区欢迎。通常最好提供一个简短的解释,解释答案如何解决问题。Flex不实现
\s
\s
转义。请参见从第一条
/*
注释开始到最后一条注释结束的匹配。Flex不实现非贪婪匹配,因此没有简单的修复方法。
[/][*][^*]*[*]+([^*/][^*]*[*]+)*[/]
%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;
                        }