C 检查flex中未完成的注释

C 检查flex中未完成的注释,c,flex-lexer,lex,lexical-analysis,C,Flex Lexer,Lex,Lexical Analysis,我是个新手。我刚刚编写了一个使用flex程序检测多行注释的示例代码。现在我想改进代码。我想检测代码中未完成和格式错误的注释。例如:以/*开头但不以*/结尾的注释是未完成的注释,我所说的格式错误的注释是指注释的格式不正确,例如,注释中出现EOF等。我必须在代码中添加什么来检查这些内容?我的示例代码如下: %x COMMENT_MULTI_LINE %{ char* commentStart; %} %% [\n\t\r ]+ { /* ignore whitespace */ } &

我是个新手。我刚刚编写了一个使用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();         
}
%x注释\u多行
%{
char*commentStart;
%}
%%
[\n\t\r]+{
/*忽略空白*/}
"/*" { 
commentStart=yytext;
开始(注释多行);
}
"*/" { 
char*comment=strndup(commentStart,yytext+2-commentStart);
printf(“%s”:是多行注释\n”,注释);
免费(评论);
开始(首字母);
}
. { 
} 
\n{
} 
%%
intmain(intargc,char*argv[]){
yylex();
}
非常有用,因为它以您的案例为例,它们的代码也可以逐字复制到您的flex程序中

正如它所解释的,当使用
时,不能将其置于正常的正则表达式模式中。它只能以一个国家的名义进行。在您的代码中,您使用一个状态来表示您在注释中。此状态称为
COMMENT\u MULTI
。你所要做的就是把它放在
标记的前面,并给它一个动作:

<COMMENT_MULTI><<EOF>> {printf("Unterminated Comment: %s\n", yytext); 
                        yyterminate();}
{printf(“未终止的注释:%s\n”,yytext);
yyterminate();}
特殊操作函数
yyterminate()
告诉flex您已经识别了
,并且它标志着程序输入的结束

我已经对此进行了测试,它可以在您的代码中运行。(也可以使用多行字符串)