2016-04-28 47 views
2

次のlexプログラムを使って、テキストファイルの単語数を数えました。私のための「Word」は、アルファベットで始まり、アルファベット/数字/ _が0回以上続く任意の文字列です。単語数を数えるためのlexプログラム

%{ 
int words; 
%} 

%% 
[a-zA-Z][a-zA-Z0-9_]* {words++; printf("%s %d\n",yytext,words);} 
. ; 
%% 

int main(int argc, char* argv[]) 
{ 
    if(argc == 2) 
    { 

     yyin = fopen(argv[1], "r"); 

     yylex(); 

     printf("No. of Words : %d\n",words); 

     fclose(yyin); 
    } 

    else 
     printf("Invalid No. of Arguments\n"); 

    return 0; 
} 

問題は次のテキストファイルでは、私はNo. of Words : 13を取得しています。私はyytextを印刷しようとしましたが、それは'9manav'から'manav'を単語として解釈しています。

また、私のコードの中に[0-9][a-zA-Z0-9_]* ;を含めてみましたが、同じ出力を表示しています。私はなぜこれが起こっているのか、それを避けるための方法を知りたい。

テキストファイル: -

the quick brown fox jumps right over the lazy dog cout for 
9manav 
-99-7-5 32 69 99 +1 

答えて

1

まず、manavは完全に言葉のあなたの定義に合致しています。その前にある9は、.ルールと一致します。空白はlexでは特別ではないことを覚えておいてください。

あなたは別のルール[0-9][a-zA-Z0-9_]* ;を追加することで適切なアイデアを得ましたが、ルールセットがあいまいであるため(入力に一致するいくつかの方法があります)、ルールの順序が重要です。私がlexで働いていたのは間もないですが、ルールの前に新しいルールを置くといいはずです。

+0

すべきではありません。ルールはここで「単語」の数を増やしていないので、「9manav」を完全にスキップします。 –

+1

いいえ、一度に1文字にしか一致しません。 「9」がなくなると、ルールruleが始まります。 – Henry

+0

その場合、[a-zA-z]で始まる文字列をチェックする方法を教えてください。 –

関連する問題