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