2015-05-01 41 views
1

我是flex的新手。我剛剛寫了一個示例代碼,使用flex程序檢測多行註釋。現在我想改進代碼。我想在代碼中檢測未完成和不正確的註釋。例如:以/ *開始的註釋沒有結尾* /是一個未完成的註釋和不成形的註釋我的意思是這個註釋沒有正確地形成,例如,EOF出現在註釋等內部。我必須在我的代碼中添加什麼檢查這些東西?我的示例代碼如下:在flex中檢查未完成的註釋

%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();   
} 

回答

1

flex manual section on using <<EOF>>是非常有幫助的,因爲它具有完全相同的情況下,作爲一個例子,他們的代碼也可以逐字複製到你的Flex程序。

正如它解釋的,當使用<<EOF>>時,不能將其置於正常的正則表達式模式中。它只能由一個國家的名稱進行。在你的代碼中,你正在使用一個狀態來表示你在評論中。這種狀態被稱爲COMMENT_MULTI。所有你需要做的就是把那個在<<EOF>>標記前,並給它一個動作做:

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

專項行動功能yyterminate()告訴撓你已經認識到<<EOF>>,它標誌着結束 - 輸入你的程序。

我測試過了,它在你的代碼中有效。 (還有多行字符串)。