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
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'une règle pour traiter d '"inintéressant" caractères; vous avez encore besoin de les compter.
Vous ne voulez pas de refuser les retours à la ligne.
Vous n'avez pas besoin de fuite contexte sur la définition de
word
. Vous devriez probablement inclure lettres majuscules commecharacter
.Cela semble fonctionner:
Lors de l'exécuter sur son propre code source, la sortie a été:
La norme
wc
de commande (qui a une définition différente de "mot"), on obtient:Ceci est en accord sur le nombre de lignes et de caractères.
Hmmm...si vous ne comptez pas les caractères qui ne sont pas dans les mots? Le nombre de caractères est les caractères alphabétiques dans les mots, pas la ponctuation et les retours à la ligne et ainsi de suite? Mais les chiffres, alors qu'ils sont une partie d'un mot, ne comptent pas comme des personnages? Définitions intéressantes; pas immédiatement évident à partir de la question. Mais avec ces définitions et de votre échantillon de données, vous pouvez vous retrouver avec de la "bonne réponse".
Vous pouvez également faire usage de lex variable interne yyleng au lieu d'utiliser strlen().
OriginalL'auteur Jonathan Leffler