2015-05-01 54 views
1

我剛剛學習flex,並且寫了一個flex程序來檢測給定的單詞是否爲動詞。我將從文本文件中獲取輸入。我想要改進代碼。我想檢測代碼中是否有任何形式不良或未完成的字符串。未完成意味着它開始使用開始符號(「」或/ *),但沒有任何結尾和形成的意思,例如(「I我的代碼如下:在flex中檢測不良形成的字符串和註釋

%% 

[\t]+ 

is | 

am | 

are | 

was | 

were {printf("%s: is a verb",yytext);} 

[a-zA-Z]+ {printf("%s: is a verb",yytext);} 

["][^"]*["] {printf("'%s': is a string\n", yytext); } 

. |\n 

%% 

int main(int argc, char *argv[]){  
    yyin = fopen(argv[1], "r");  
    yylex();   
    fclose(yyin); 
} 
(這是一個男孩) 。

回答

1

這是解決multi-line comment problem answered previously.類似我從報:

flex manual section on using <<EOF>>是相當 有益,因爲它具有完全相同的情況下,作爲一個例子,他們的代碼可以 也會逐字複製到您的flex程序中。

,因爲它解釋,使用<<EOF>>當你不能把它在一個正常的 正則表達式模式。它只能由一個國家的名稱進行。在你的代碼中,你正在使用一個狀態來表明你在一個字符串中是 。這種狀態被稱爲STRING_MULTI。所有你有 要做的是把它放在<<EOF>>標記前,並給它一個 的行動。

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

結合的叮咬和評論到一個柔性方案爲您提供:

%option noyywrap 
%x COMMENT_MULTI STRING_MULTI 


%% 

[\n\t\r ]+ { 
    /* ignore whitespace */ } 


<INITIAL>"/*" { 
    /* begin of multi-line comment */ 
    yymore(); 
    BEGIN(COMMENT_MULTI); 
} 

<INITIAL>["] { yymore(); BEGIN(STRING_MULTI);} 

<STRING_MULTI>[^"]+ {yymore(); } 

<STRING_MULTI>["] {printf("String was : %s\n",yytext); BEGIN(INITIAL); } 

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

<COMMENT_MULTI>"*/" { 
    /* end of multi-line comment */ 
    printf("'%s': was a multi-line comment\n", yytext); 
    BEGIN(INITIAL); 
} 

<COMMENT_MULTI>. { 
    yymore(); 
} 

<COMMENT_MULTI>\n { 
    yymore(); 
} 

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

%% 

int main(int argc, char *argv[]){  
    yylex();   
}