C++ 使用flex/bison的多行注释声明

C++ 使用flex/bison的多行注释声明,c++,comments,bison,interpreted-language,C++,Comments,Bison,Interpreted Language,今天我的flex/bison脚本有问题。它没有检测到多行注释 %x COMMENT_MULTI #\[ yy_push_state(COMMENT_MULTI); <COMMENT_MULTI>"]#" yy_pop_state(); <COMMENT_MULTI>"\n" { yylloc->lines(yyleng);

今天我的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>.?
/*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;
}  

你能帮我吗

>这是我在BISY定义C++注释和块注释中使用的解决方案:

/*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;
}  
%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"                     ;

您需要%%标记将定义部分与规则部分分开。当我添加该选项和%option堆栈时,您的扫描仪对我来说工作正常…此答案不是英文的,并且没有提供有关代码实际功能的任何解释。答案已经部分翻译,我认为代码足以使其理解。现在我翻译了它的评论,它应该能帮助更多的人@Rovanion,如果您以前不理解,我很抱歉,但是翻译后的评论现在应该有帮助了