次の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
すべきではありません。ルールはここで「単語」の数を増やしていないので、「9manav」を完全にスキップします。 –
いいえ、一度に1文字にしか一致しません。 「9」がなくなると、ルールruleが始まります。 – Henry
その場合、[a-zA-z]で始まる文字列をチェックする方法を教えてください。 –