我正在创建一个lexer.l文件,除了一个部分之外,它正在按预期工作。我有规则:
[\(\*.*\*\)] {}
我想在文件中遇到(* this is a test *)
时这样做,我根本就什么都不做。但是当我运行lex lexer.l
时,我会在规则\(
,\*
和\)
的行上收到警告,说明它们永远无法满足。所以我想我的问题是为什么[\(\*.*\*\)] {}
会干扰\(
和其他人?我怎样才能抓住(* this is a test *)
?
答案 0 :(得分:0)
注释语法(*…*)
的语言通常允许嵌套注释,并且(f)lex不能轻易识别嵌套注释,因为嵌套需要无上下文语法,而词法扫描器只能实现常规语言。 / p>
如果您的评论没有嵌套(以便(* something (* else *)
是评论,而不是更长评论的前缀),那么您可以使用正则表达式
[(][*][^*]*[*]+([^*)][^*]*[*]+)*[)]
如果确实需要嵌套注释,可以使用开始条件和堆栈(或模拟堆栈,如下所示):
%x SC_COMMENT
%%
int comment_nesting = 0;
"(*" { BEGIN(SC_COMMENT); }
<SC_COMMENT>{
"(*" { ++comment_nesting; }
"*"+")" { if (comment_nesting) --comment_nesting;
else BEGIN(INITIAL); }
"*"+ ;
[^(*\n]+ ;
[(] ;
\n ;
}
该片段取自this answer,并进行了少量调整,因为该答案可识别嵌套的/*…*/
条评论。这里出现了对代码的更全面的解释。