Lex: un petit programme permettant de compter le nombre de mots dans l'entrée

Je suis très nouveau à Lex et l'exigence complète de ce problème est comme suit:

Écrire un Lex fichier d'entrée qui permettra de produire un programme qui compte
de caractères, de mots et de lignes dans un fichier texte et des rapports sur les chiffres.
Définir un mot à toute séquence de lettres et/ou chiffres, sans
des signes de ponctuation ou des espaces. La ponctuation et les espaces blancs ne sont pas considérés comme
mots.

Maintenant que j'ai écrit le code:

%{
#include <stdio.h>
#include <stdlib.h>
int cno = 0, wno = 0, lno = 0; /*counts of characters, words and lines */
%}
character [a-z]
digit [0-9]
word ({character}|{digit})+[^({character}|{digit})]
line \n
%%
{line} { lno++; REJECT; }
{word} { wno++; REJECT; }
{character} { cno++; }
%%
void main()
{ yylex();
  fprintf(stderr, "Number of characters: %d; Number of words: %d; Number of lines: %d\n", cno, wno, lno);
  return;
}

Je l'ai testé avec le fichier texte:

this is line #1
line #2 is here
!@#$%^&*()
haha hey hey

Et j'ai eu la sortie

   #1
 #2  
!@#$%^&*()

Number of characters: 30; Number of words: 45; Number of lines: 4

Mais la sortie correcte devrait être

Number of characters: 30; Number of words: 11; Number of lines: 4

Je suppose que l'erreur de "nombre de mots" devrait être en quelque sorte en raison de tous les nombre de caractères, alors comment dois-je modifier mon programme pour s'attaquer à ce problème?

Aussi, il y a quelques inutile de sortie de sortir (ces signes de ponctuation). Comment dois-je modifier mon programme pour les éviter?

Merci beaucoup.

OriginalL'auteur goldfrapp04 | 2012-05-09