2016-04-28 14 views
2

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 

Antwort

1

Zuerst wird die manav perfekt ist Ihre Definition des Wortes entsprechen. Die davor entspricht der . Regel. Denken Sie daran, dass Leerzeichen in lex nicht speziell sind.

Sie hatten die richtige Idee, indem Sie eine weitere Regel [0-9][a-zA-Z0-9_]* ; hinzufügten, aber da der Regelsatz nicht eindeutig ist (es gibt mehrere Möglichkeiten, die Eingabe anzupassen), ist die Reihenfolge der Regeln wichtig. Es ist eine Weile, dass ich mit Lex gearbeitet habe, aber ich denke, die neue Regel vor das Wort Regel zu setzen, sollte funktionieren.

+0

Sollte nicht die. Überspringe die '9manav' ganz einfach, da ich die Anzahl der 'Wörter' hier nicht inkrementiere. –

+1

Nein, es passt nur ein Zeichen gleichzeitig. Sobald die '9' weg ist, setzt die Wortregel ein. – Henry

+0

Können Sie mir in diesem Fall eine Idee geben, wie man Strings streng nach [a-zA-z] sucht? –