%{
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *yyin;
%}
digit [0-9]
id [A-Za-z][A-Za-z0-9]*
li\"[^\"]*\" // Define a string literal pattern
%%
void|main|int|printf { printf("\nA keyword: %s\n", yytext); }
{digit
}+ { printf
("\nAn
integer: %s (%d)\n", yytext, atoi(yytext)); } {digit
}+"
."
{digit
}* { printf
("\nA
float: %s (%g)\n", yytext, atof(yytext)); } {id} { printf("\nAn identifier: %s\n", yytext); }
"+"|"-"|"*"|"/"|"=" { printf("\nAn operator: %s\n", yytext); }
";"|"("|")"|":"|","|"}"|"{" { printf("\n%s is a punctuation\n", yytext); }
#{id}"<"{id}"."{id}">" { printf("\n%s is a preprocessor directive\n", yytext); }
{li}"%"{id}+{li} { printf("\n%s is a literal string\n", yytext); }
{li}{id}+{li} { printf("\n%s is a literal string\n", yytext); }
%%
int main(int argc, char **argv) {
if (argc > 1) {
yyin = fopen(argv[1], "r");
if (yyin == NULL) {
printf
("Cannot
open file
%s\n", argv[1]); return 1;
}
} else {
yyin = stdin;
}
yylex
(); // Call the lexer to process the input file or stdin
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCkZJTEUgKnl5aW47CiV9CgpkaWdpdCBbMC05XQppZCBbQS1aYS16XVtBLVphLXowLTldKgpsaVwiW15cIl0qXCIgICAvLyBEZWZpbmUgYSBzdHJpbmcgbGl0ZXJhbCBwYXR0ZXJuCgolJQoKdm9pZHxtYWlufGludHxwcmludGYgICAgICAgICAgICAgeyBwcmludGYoIlxuQSBrZXl3b3JkOiAlc1xuIiwgeXl0ZXh0KTsgfQp7ZGlnaXR9KyAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiXG5BbiBpbnRlZ2VyOiAlcyAoJWQpXG4iLCB5eXRleHQsIGF0b2koeXl0ZXh0KSk7IH0Ke2RpZ2l0fSsiLiJ7ZGlnaXR9KiAgICAgICAgICAgICAgeyBwcmludGYoIlxuQSBmbG9hdDogJXMgKCVnKVxuIiwgeXl0ZXh0LCBhdG9mKHl5dGV4dCkpOyB9CntpZH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJcbkFuIGlkZW50aWZpZXI6ICVzXG4iLCB5eXRleHQpOyB9CiIrInwiLSJ8IioifCIvInwiPSIgICAgICAgICAgICAgIHsgcHJpbnRmKCJcbkFuIG9wZXJhdG9yOiAlc1xuIiwgeXl0ZXh0KTsgfQoiOyJ8IigifCIpInwiOiJ8IiwifCJ9InwieyIgICAgIHsgcHJpbnRmKCJcbiVzIGlzIGEgcHVuY3R1YXRpb25cbiIsIHl5dGV4dCk7IH0KI3tpZH0iPCJ7aWR9Ii4ie2lkfSI+IiAgICAgICAgICAgeyBwcmludGYoIlxuJXMgaXMgYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlXG4iLCB5eXRleHQpOyB9CntsaX0iJSJ7aWR9K3tsaX0gICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJcbiVzIGlzIGEgbGl0ZXJhbCBzdHJpbmdcbiIsIHl5dGV4dCk7IH0Ke2xpfXtpZH0re2xpfSAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIlxuJXMgaXMgYSBsaXRlcmFsIHN0cmluZ1xuIiwgeXl0ZXh0KTsgfQoKJSUKCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgaWYgKGFyZ2MgPiAxKSB7CiAgICAgICAgeXlpbiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CiAgICAgICAgaWYgKHl5aW4gPT0gTlVMTCkgewogICAgICAgICAgICBwcmludGYoIkNhbm5vdCBvcGVuIGZpbGUgJXNcbiIsIGFyZ3ZbMV0pOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHl5aW4gPSBzdGRpbjsKICAgIH0KCiAgICB5eWxleCgpOyAgLy8gQ2FsbCB0aGUgbGV4ZXIgdG8gcHJvY2VzcyB0aGUgaW5wdXQgZmlsZSBvciBzdGRpbgoKICAgIHJldHVybiAwOwp9Cg==