我是个新手。我刚刚编写了一个使用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>>
,它标志着程序输入的结束。我已经测试过了,它在你的代码中工作。(还有多行字符串)。
关于c - 在Flex中检查未完成的评论,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29991073/