我今天有一个我的flex / bison脚本的问题。它不会检测多行注释。
%x COMMENT_MULTI
#\[ yy_push_state(COMMENT_MULTI);
<COMMENT_MULTI>"]#" yy_pop_state();
<COMMENT_MULTI>"\n" {
yylloc->lines(yyleng);
yylloc->step();
}
<COMMENT_MULTI>.?
你能帮帮我吗?
答案 0 :(得分:2)
这是我最终在C ++注释和块注释的bison定义中使用的解决方案:
%x COMMENT
"//".*\n ;
"/*" BEGIN(COMMENT);
<COMMENT>"/*" printf("%s%d\n", "Warning: multiple comments opened at line: ", yylineno);
<COMMENT>"*/" BEGIN(INITIAL);
<COMMENT>"EOF" yyerror("Reached end of file while scanning comment");
<COMMENT>.|"\n" ;
答案 1 :(得分:-2)
/*DECLARING A SPECIFIC STATE FOR THE BLOCK COMMENT*/
%x BLOCK_COMMENT
%%
\/\* { // BEGINING OF A BLOCK COMMENT: ENTERS INTO 'BLOCK_COMMENT' STATE
BEGIN(BLOCK_COMMENT);
blockcomment_line_start = line;
blockcomment_col_start = frcol;
strncat(block_comment, yytext, sizeof(block_comment));
}
<BLOCK_COMMENT>\*\/ { // END OF BLOCK COMMENT
if(strlen(block_comment)+strlen(yytext) >= BLOCK_COMMENT_BUFFER-10){ //ADDS "(...)" AT THE END OF THE STRING IN CASE IT HAS BEEN TRUNCATED
block_comment[1013] = '\0';
strcat(block_comment," (...) ");
}
strncat(block_comment, yytext, sizeof(block_comment));
printf("@(%.3d,%.3d)\tBLOCK COMMENT\t- %s\n", blockcomment_line_start, blockcomment_col_start, block_comment);
BEGIN(INITIAL); //COMES BACK TO THE INITIAL STATE
}
<BLOCK_COMMENT>\n {
line++; // STILL HAS TO INCREMENT THE LINE NUMBER WHEN THERE'S A LINE BREAK INSIDE THE COMMENT
//strcat(block_comment, "\\n");
strncat(block_comment, "\\n", sizeof(block_comment));
}
<BLOCK_COMMENT>. { // IGNORE ALL OTHER CHARACTERS WHILE IN 'BLOCK_COMMENT' STATE
//strcat(block_comment, yytext);
strncat(block_comment, yytext, sizeof(block_comment));
}
<BLOCK_COMMENT><<EOF>> {
printf("ERROR! THE BLOCK COMMENT OPENED IN @(%d,%d) HASN'T BEEN CLOSED! \t\n", blockcomment_line_start, blockcomment_col_start);
return;
}