%{
#include <stdio.h>
#include <string.h>
int intCount = 0;
int doubleCount = 0;
int identifierCount = 0;
int stringCount = 0;
int longestStringLength = 0;
int nonWordCharCount = 0;
int lineCount = 0;
%}
%3
/* regular definitions */
delim [ \t\n]
ws {delim}+
letter [A-Za-z]
digit [0-9]
identifier ({letter}|{digit})*
type
(double
|lint
|char
|signed
|float|short
|void
)keyword (type|main|auto|struct|break|else|long|switch|case|enum|register|typedef|extern|return|union|continue|for|void|do|if|static|while|default|goto|sizeof|volatile|const|printf)
%%
{ws} ; /* skip whitespace */
int {printf("int\n"); intCount++;}
double {printf("double\n"); doubleCount++;}
{identifier} {
printf("%s\n", yytext);
identifierCount++;
}
\"([^\"\\n]|(\\\.))*\" {
printf("String\n");
stringCount++;
int len = strlen(yytext) - 2; // Exclude the surrounding double quotes
if (len > longestStringLength) {
longestStringLength = len;
}
}
\'[^\'\\n]\'. /* ignore single-quoted strings */
[+-]?{digit}+(\.{digit}+)? { /* recognize numbers */
if (strchr(yytext, '.') != NULL) {
printf("double\n");
doubleCount++;
} else {
printf("int\n");
intCount++;
}
}
. {nonWordCharCount++;}
\n {lineCount++;}
%%
int main(int argc, char *argv[]) {
if (argc != 2) {
printf("Usage: %s <input_file>\n", argv[0]);
return 1;
}
FILE *inputFile = fopen(argv[1], "r");
if (inputFile == NULL) {
perror("Unable to open input file");
return 1;
}
yyin = inputFile;
yylex();
fclose(inputFile);
printf("The number of integer numbers is %d\n", intCount);
printf("The number of double numbers is %d\n", doubleCount);
printf("The number of Identifiers is %d\n", identifierCount);
printf("The number of String is %d\n", stringCount);
printf("The longest String is \"%s\" of length %d\n", yytext, longestStringLength);
printf("The number of characters that are not word characters: %d\n", nonWordCharCount);
printf("The number of lines: %d\n", lineCount);
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCmludCBpbnRDb3VudCA9IDA7CmludCBkb3VibGVDb3VudCA9IDA7CmludCBpZGVudGlmaWVyQ291bnQgPSAwOwppbnQgc3RyaW5nQ291bnQgPSAwOwppbnQgbG9uZ2VzdFN0cmluZ0xlbmd0aCA9IDA7CmludCBub25Xb3JkQ2hhckNvdW50ID0gMDsKaW50IGxpbmVDb3VudCA9IDA7CiV9CgolMwoKLyogcmVndWxhciBkZWZpbml0aW9ucyAqLwpkZWxpbSBbIFx0XG5dCndzIHtkZWxpbX0rCgpsZXR0ZXIgW0EtWmEtel0KZGlnaXQgWzAtOV0KaWRlbnRpZmllciAoe2xldHRlcn18e2RpZ2l0fSkqCnR5cGUgKGRvdWJsZXxsaW50fGNoYXJ8c2lnbmVkfGZsb2F0fHNob3J0fHZvaWQpCmtleXdvcmQgKHR5cGV8bWFpbnxhdXRvfHN0cnVjdHxicmVha3xlbHNlfGxvbmd8c3dpdGNofGNhc2V8ZW51bXxyZWdpc3Rlcnx0eXBlZGVmfGV4dGVybnxyZXR1cm58dW5pb258Y29udGludWV8Zm9yfHZvaWR8ZG98aWZ8c3RhdGljfHdoaWxlfGRlZmF1bHR8Z290b3xzaXplb2Z8dm9sYXRpbGV8Y29uc3R8cHJpbnRmKQoKJSUKCnt3c30gICA7IC8qIHNraXAgd2hpdGVzcGFjZSAqLwoKaW50ICAgIHtwcmludGYoImludFxuIik7IGludENvdW50Kys7fQpkb3VibGUge3ByaW50ZigiZG91YmxlXG4iKTsgZG91YmxlQ291bnQrKzt9Cgp7aWRlbnRpZmllcn0gewogICAgcHJpbnRmKCIlc1xuIiwgeXl0ZXh0KTsKICAgIGlkZW50aWZpZXJDb3VudCsrOwp9CgpcIihbXlwiXFxuXXwoXFxcLikpKlwiIHsKICAgIHByaW50ZigiU3RyaW5nXG4iKTsKICAgIHN0cmluZ0NvdW50Kys7CiAgICBpbnQgbGVuID0gc3RybGVuKHl5dGV4dCkgLSAyOyAvLyBFeGNsdWRlIHRoZSBzdXJyb3VuZGluZyBkb3VibGUgcXVvdGVzCiAgICBpZiAobGVuID4gbG9uZ2VzdFN0cmluZ0xlbmd0aCkgewogICAgICAgIGxvbmdlc3RTdHJpbmdMZW5ndGggPSBsZW47CiAgICB9Cn0KClwnW15cJ1xcbl1cJy4gICAgLyogaWdub3JlIHNpbmdsZS1xdW90ZWQgc3RyaW5ncyAqLwoKWystXT97ZGlnaXR9KyhcLntkaWdpdH0rKT8geyAvKiByZWNvZ25pemUgbnVtYmVycyAqLwogICAgaWYgKHN0cmNocih5eXRleHQsICcuJykgIT0gTlVMTCkgewogICAgICAgIHByaW50ZigiZG91YmxlXG4iKTsKICAgICAgICBkb3VibGVDb3VudCsrOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoImludFxuIik7CiAgICAgICAgaW50Q291bnQrKzsKICAgIH0KfQoKLiB7bm9uV29yZENoYXJDb3VudCsrO30KClxuIHtsaW5lQ291bnQrKzt9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgaWYgKGFyZ2MgIT0gMikgewogICAgICAgIHByaW50ZigiVXNhZ2U6ICVzIDxpbnB1dF9maWxlPlxuIiwgYXJndlswXSk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgIEZJTEUgKmlucHV0RmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CiAgICBpZiAoaW5wdXRGaWxlID09IE5VTEwpIHsKICAgICAgICBwZXJyb3IoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUiKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICB5eWluID0gaW5wdXRGaWxlOwogICAgeXlsZXgoKTsKICAgIAogICAgZmNsb3NlKGlucHV0RmlsZSk7CiAgICAKICAgIHByaW50ZigiVGhlIG51bWJlciBvZiBpbnRlZ2VyIG51bWJlcnMgaXMgJWRcbiIsIGludENvdW50KTsKICAgIHByaW50ZigiVGhlIG51bWJlciBvZiBkb3VibGUgbnVtYmVycyBpcyAlZFxuIiwgZG91YmxlQ291bnQpOwogICAgcHJpbnRmKCJUaGUgbnVtYmVyIG9mIElkZW50aWZpZXJzIGlzICVkXG4iLCBpZGVudGlmaWVyQ291bnQpOwogICAgcHJpbnRmKCJUaGUgbnVtYmVyIG9mIFN0cmluZyBpcyAlZFxuIiwgc3RyaW5nQ291bnQpOwogICAgcHJpbnRmKCJUaGUgbG9uZ2VzdCBTdHJpbmcgaXMgXCIlc1wiIG9mIGxlbmd0aCAlZFxuIiwgeXl0ZXh0LCBsb25nZXN0U3RyaW5nTGVuZ3RoKTsKICAgIHByaW50ZigiVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB3b3JkIGNoYXJhY3RlcnM6ICVkXG4iLCBub25Xb3JkQ2hhckNvdW50KTsKICAgIHByaW50ZigiVGhlIG51bWJlciBvZiBsaW5lczogJWRcbiIsIGxpbmVDb3VudCk7CgogICAgcmV0dXJuIDA7Cn0K