%{
#include <stdio.h>
#include <string.h>
#define MAXWORDS 1000
#define MAXLEN 50
char words[MAXWORDS][MAXLEN];
int count[MAXWORDS];
int nwords = 0;
void addword(char *w) {
for (int i = 0; i < nwords; i++) {
if (strcmp(words[i], w) == 0) {
count[i]++;
return;
}
}
strcpy(words[nwords], w);
count[nwords++] = 1;
}
%}
%%
[a-zA-Z]+ { addword(yytext); }
[ \t\n]+ { /* ignore whitespace */ }
. { /* ignore other chars */ }
%%
int main() {
yylex();
printf("\n--- Histogram of Words ---\n");
for (int i = 0; i < nwords; i++) {
printf("%s : ", words[i]);
for (int j = 0; j < count[i]; j++) printf("*");
printf(" (%d)\n", count[i]);
}
return 0;
}
int yywrap() { return 1; }
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgTUFYV09SRFMgMTAwMAojZGVmaW5lIE1BWExFTiA1MAoKY2hhciB3b3Jkc1tNQVhXT1JEU11bTUFYTEVOXTsKaW50IGNvdW50W01BWFdPUkRTXTsKaW50IG53b3JkcyA9IDA7Cgp2b2lkIGFkZHdvcmQoY2hhciAqdykgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBud29yZHM7IGkrKykgewogICAgICAgIGlmIChzdHJjbXAod29yZHNbaV0sIHcpID09IDApIHsKICAgICAgICAgICAgY291bnRbaV0rKzsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHN0cmNweSh3b3Jkc1tud29yZHNdLCB3KTsKICAgIGNvdW50W253b3JkcysrXSA9IDE7Cn0KJX0KCiUlClthLXpBLVpdKyAgIHsgYWRkd29yZCh5eXRleHQpOyB9ClsgXHRcbl0rICAgIHsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQouICAgICAgICAgICB7IC8qIGlnbm9yZSBvdGhlciBjaGFycyAqLyB9CiUlCgppbnQgbWFpbigpIHsKICAgIHl5bGV4KCk7CiAgICBwcmludGYoIlxuLS0tIEhpc3RvZ3JhbSBvZiBXb3JkcyAtLS1cbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBud29yZHM7IGkrKykgewogICAgICAgIHByaW50ZigiJXMgOiAiLCB3b3Jkc1tpXSk7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudFtpXTsgaisrKSBwcmludGYoIioiKTsKICAgICAgICBwcmludGYoIiAoJWQpXG4iLCBjb3VudFtpXSk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IHl5d3JhcCgpIHsgcmV0dXJuIDE7IH0K