%{
#include <stdio.h>
#include <string.h>
int keywords = 0, identifiers = 0, operators = 0, separators = 0;
char *keywordList[] = {
"int", "float", "char", "if", "else", "return", "while", "for", "do", "switch"
};
int isKeyword(char *str) {
for (int i = 0; i < sizeof(keywordList)/sizeof(char*); i++) {
if (strcmp(str, keywordList[i]) == 0)
return 1;
}
return 0;
}
%}
%option noyywrap
%%
[a-zA-Z_][a-zA-Z0-9_]* {
if (isKeyword(yytext)) {
keywords++;
printf("Keyword: %s\n", yytext);
} else {
identifiers++;
printf("Identifier: %s\n", yytext);
}
}
"=="|"!="|"<="|">="|"="|"+"|"-"|"*"|"/"|"<"|">" {
operators++;
printf("Operator: %s\n", yytext);
}
[(){},;:\[\]] {
separators++;
printf("Separator: %s\n", yytext);
}
[0-9]+ ; // Ignore numbers
[ \t\n]+ ; // Ignore whitespace
. ; // Ignore other characters
%%
int main() {
char str[1000];
printf("Enter code:\n");
fgets(str, sizeof(str), stdin);
YY_BUFFER_STATE buffer = yy_scan_string(str);
yylex();
yy_delete_buffer(buffer);
printf("\nToken Counts:\n");
printf("Keywords: %d\n", keywords);
printf("Identifiers: %d\n", identifiers);
printf("Operators: %d\n", operators);
printf("Separators: %d\n", separators);
return 0;
}
int yywrap() {
return 1;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmludCBrZXl3b3JkcyA9IDAsIGlkZW50aWZpZXJzID0gMCwgb3BlcmF0b3JzID0gMCwgc2VwYXJhdG9ycyA9IDA7CgpjaGFyICprZXl3b3JkTGlzdFtdID0gewogICAgImludCIsICJmbG9hdCIsICJjaGFyIiwgImlmIiwgImVsc2UiLCAicmV0dXJuIiwgIndoaWxlIiwgImZvciIsICJkbyIsICJzd2l0Y2giCn07CgppbnQgaXNLZXl3b3JkKGNoYXIgKnN0cikgewogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2Yoa2V5d29yZExpc3QpL3NpemVvZihjaGFyKik7IGkrKykgewogICAgICAgIGlmIChzdHJjbXAoc3RyLCBrZXl3b3JkTGlzdFtpXSkgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICByZXR1cm4gMDsKfQolfQoKJW9wdGlvbiBub3l5d3JhcAoKJSUKW2EtekEtWl9dW2EtekEtWjAtOV9dKiB7CiAgICBpZiAoaXNLZXl3b3JkKHl5dGV4dCkpIHsKICAgICAgICBrZXl3b3JkcysrOwogICAgICAgIHByaW50ZigiS2V5d29yZDogJXNcbiIsIHl5dGV4dCk7CiAgICB9IGVsc2UgewogICAgICAgIGlkZW50aWZpZXJzKys7CiAgICAgICAgcHJpbnRmKCJJZGVudGlmaWVyOiAlc1xuIiwgeXl0ZXh0KTsKICAgIH0KfQoKIj09InwiIT0ifCI8PSJ8Ij49InwiPSJ8IisifCItInwiKiJ8Ii8ifCI8InwiPiIgewogICAgb3BlcmF0b3JzKys7CiAgICBwcmludGYoIk9wZXJhdG9yOiAlc1xuIiwgeXl0ZXh0KTsKfQoKWygpe30sOzpcW1xdXSB7CiAgICBzZXBhcmF0b3JzKys7CiAgICBwcmludGYoIlNlcGFyYXRvcjogJXNcbiIsIHl5dGV4dCk7Cn0KClswLTldKyAgICAgOyAvLyBJZ25vcmUgbnVtYmVycwpbIFx0XG5dKyAgIDsgLy8gSWdub3JlIHdoaXRlc3BhY2UKLiAgICAgICAgICA7IC8vIElnbm9yZSBvdGhlciBjaGFyYWN0ZXJzCiUlCgppbnQgbWFpbigpIHsKICAgIGNoYXIgc3RyWzEwMDBdOwogICAgcHJpbnRmKCJFbnRlciBjb2RlOlxuIik7CiAgICBmZ2V0cyhzdHIsIHNpemVvZihzdHIpLCBzdGRpbik7CiAgICBZWV9CVUZGRVJfU1RBVEUgYnVmZmVyID0geXlfc2Nhbl9zdHJpbmcoc3RyKTsKICAgIHl5bGV4KCk7CiAgICB5eV9kZWxldGVfYnVmZmVyKGJ1ZmZlcik7CgogICAgcHJpbnRmKCJcblRva2VuIENvdW50czpcbiIpOwogICAgcHJpbnRmKCJLZXl3b3JkczogJWRcbiIsIGtleXdvcmRzKTsKICAgIHByaW50ZigiSWRlbnRpZmllcnM6ICVkXG4iLCBpZGVudGlmaWVycyk7CiAgICBwcmludGYoIk9wZXJhdG9yczogJWRcbiIsIG9wZXJhdG9ycyk7CiAgICBwcmludGYoIlNlcGFyYXRvcnM6ICVkXG4iLCBzZXBhcmF0b3JzKTsKCiAgICByZXR1cm4gMDsKfQoKaW50IHl5d3JhcCgpIHsKICAgIHJldHVybiAxOwp9Cg==