%{
#include <stdio.h>
int word_count = 0;
// Helper function to check if a string
is a valid C
++ identifier or word
int is_word(const char *s) {
while (*s) {
if (isalnum(*s) || *s == '_')
return 1;
s++;
}
return 0;
}
%}
%%
// Skip single-line comments
"//".* { /* Ignore */ }
// Skip multi-line comments
"/*"([^*]|\*+[^*/])*\*+"/" { /* Ignore */ }
// Skip string literals
\"([^\\\"]|\\.)*\" { /* Ignore */ }
// Match words (identifiers, keywords, etc.)
[a-zA-Z_][a-zA-Z0-9_]* { word_count++; }
// Match numbers (considered as words)
[0-9]+ { word_count++; }
// Skip whitespace
[ \t\n\r]+ { /* Ignore */ }
// Everything else
. { /* Ignore punctuation, etc. */ }
%%
int main(int argc, char **argv)
{
if (argc > 1) {
FILE *file = fopen(argv[1], "r");
if (!file) {
perror
("Cannot
open file"
); return 1;
}
yyin = file;
}
yylex();
printf
("Total
number of words
: %d\n", word_count); return 0;
}
int yywrap() {
return 1;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CgppbnQgd29yZF9jb3VudCA9IDA7CgovLyBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBDKysgaWRlbnRpZmllciBvciB3b3JkCmludCBpc193b3JkKGNvbnN0IGNoYXIgKnMpIHsKICAgIHdoaWxlICgqcykgewogICAgICAgIGlmIChpc2FsbnVtKCpzKSB8fCAqcyA9PSAnXycpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIHMrKzsKICAgIH0KICAgIHJldHVybiAwOwp9CiV9CgolJQoKLy8gU2tpcCBzaW5nbGUtbGluZSBjb21tZW50cwoiLy8iLiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC8qIElnbm9yZSAqLyB9CgovLyBTa2lwIG11bHRpLWxpbmUgY29tbWVudHMKIi8qIihbXipdfFwqK1teKi9dKSpcKisiLyIgICAgICAgICAgeyAvKiBJZ25vcmUgKi8gfQoKLy8gU2tpcCBzdHJpbmcgbGl0ZXJhbHMKXCIoW15cXFwiXXxcXC4pKlwiICAgICAgICAgICAgICAgICAgeyAvKiBJZ25vcmUgKi8gfQoKLy8gTWF0Y2ggd29yZHMgKGlkZW50aWZpZXJzLCBrZXl3b3JkcywgZXRjLikKW2EtekEtWl9dW2EtekEtWjAtOV9dKiAgICAgICAgICAgICAgeyB3b3JkX2NvdW50Kys7IH0KCi8vIE1hdGNoIG51bWJlcnMgKGNvbnNpZGVyZWQgYXMgd29yZHMpClswLTldKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgd29yZF9jb3VudCsrOyB9CgovLyBTa2lwIHdoaXRlc3BhY2UKWyBcdFxuXHJdKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBJZ25vcmUgKi8gfQoKLy8gRXZlcnl0aGluZyBlbHNlCi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogSWdub3JlIHB1bmN0dWF0aW9uLCBldGMuICovIH0KCiUlCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGlmIChhcmdjID4gMSkgewogICAgICAgIEZJTEUgKmZpbGUgPSBmb3Blbihhcmd2WzFdLCAiciIpOwogICAgICAgIGlmICghZmlsZSkgewogICAgICAgICAgICBwZXJyb3IoIkNhbm5vdCBvcGVuIGZpbGUiKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHl5aW4gPSBmaWxlOwogICAgfQoKICAgIHl5bGV4KCk7CgogICAgcHJpbnRmKCJUb3RhbCBudW1iZXIgb2Ygd29yZHM6ICVkXG4iLCB3b3JkX2NvdW50KTsKICAgIHJldHVybiAwOwp9CgppbnQgeXl3cmFwKCkgewogICAgcmV0dXJuIDE7Cn0K