Ich habe das folgende Lex-Programm gemacht, um die Anzahl der Wörter in einer Textdatei zu zählen. Ein "Wort" für mich ist eine beliebige Zeichenfolge, die mit einem Alphabet beginnt, gefolgt von 0 oder mehr Vorkommen von Alphabeten/Zahlen/_.Lex-Programm zum Zählen der Anzahl der Wörter
%{
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;
}
Das Problem ist, dass für die folgende Textdatei, ich bin die No. of Words : 13
bekommen. Ich habe versucht, den yytext zu drucken, und es zeigt, dass es 'manav'
von '9manav'
als ein Wort nimmt, obwohl es meiner Definition eines Wortes nicht entspricht.
Ich versuchte auch einschließlich [0-9][a-zA-Z0-9_]* ;
innerhalb meines Codes, aber zeigt immer noch die gleiche Ausgabe. Ich möchte wissen, warum dies geschieht und wie ich es vermeiden kann.
Textdatei: -
the quick brown fox jumps right over the lazy dog cout for
9manav
-99-7-5 32 69 99 +1
Sollte nicht die. Überspringe die '9manav' ganz einfach, da ich die Anzahl der 'Wörter' hier nicht inkrementiere. –
Nein, es passt nur ein Zeichen gleichzeitig. Sobald die '9' weg ist, setzt die Wortregel ein. – Henry
Können Sie mir in diesem Fall eine Idee geben, wie man Strings streng nach [a-zA-z] sucht? –