检查 flex 中未完成的评论

checking unfinished comments in flex

我是 flex 新手。我刚刚编写了一个示例代码来使用 flex 程序检测多行注释。现在我想改进代码。我想检测代码中未完成和格式错误的注释。例如:以 /* 开头而没有结尾 */ 的注释是未完成的注释,格式错误的注释是指注释格式不正确,例如,注释中出现 EOF 等。我必须在代码中添加的内容检查这些东西?我的示例代码如下:

%x COMMENT_MULTI_LINE
%{
char* commentStart;
%}

%%

[\n\t\r ]+ { 
  /* ignore whitespace */ }


<INITIAL>"/*" { 
  commentStart = yytext; 
  BEGIN(COMMENT_MULTI_LINE); 
}

<COMMENT_MULTI_LINE>"*/" { 
  char* comment = strndup(commentStart, yytext + 2 - commentStart);
  printf("'%s': was a multi-line comment\n", comment);
  free(comment); 
  BEGIN(INITIAL); 
}

<COMMENT_MULTI_LINE>. { 

} 

<COMMENT_MULTI_LINE>\n { 

} 


%%

int main(int argc, char *argv[]){    
  yylex();         
}

flex manual section on using <<EOF>> 非常有用,因为它以您的案例为例,而且他们的代码也可以逐字复制到您的 flex 程序中。

正如它所解释的那样,当使用 <<EOF>> 时,您不能将其置于正常的 正则表达式 模式中。它只能以州名开头。在您的代码中,您使用状态来指示您在评论中。这种状态叫做COMMENT_MULTI。你所要做的就是把它放在 <<EOF>> 标记的前面,并给它一个动作:

<COMMENT_MULTI><<EOF>> {printf("Unterminated Comment: %s\n", yytext); 
                        yyterminate();}

特殊动作函数 yyterminate() 告诉 flex 您已经识别出 <<EOF>> 并且它标志着程序的输入结束。

我已经测试过了,它在你的代码中有效。 (还有多行字符串)。