%{
#include <stdio.h>
#include <stdlib.h>
 
int COMMENT = 0;   // Flag to track multi-line comments
%}
 
identifier [a-zA-Z][a-zA-Z0-9]*
 
%%
 
#.*                                     { printf("\n%s is a PREPROCESSOR DIRECTIVE", yytext); }
 
(int
|float|char
|double
|while
|for
|struct
|typedef
|do
|if
|break
|continue
|void
|switch
|return
|else
|goto
)                                         { printf("\n%s is a KEYWORD", yytext); }
 
"/*"                                    { COMMENT = 1; printf("\n%s is a COMMENT", yytext); }
"*/"                                    { COMMENT = 0; printf("\n%s ends COMMENT", yytext); }
 
{identifier}\(                          { if(!COMMENT) printf("\n%s FUNCTION", yytext); }
 
{identifier}(\[[0-9]*\])?               { if(!COMMENT) printf("\n%s IDENTIFIER", yytext); }
 
\{                                      { if(!COMMENT) printf("\n%s BLOCK BEGINS", yytext); }
\}                                      { if(!COMMENT) printf("\n%s BLOCK ENDS", yytext); }
 
\;                                      { if(!COMMENT) printf("\n%s PUNCTUATOR", yytext); }
 
\".*\"                                  { if(!COMMENT) printf("\n%s STRING", yytext); }
 
[0-9]+                                   { if(!COMMENT) printf("\n%s NUMBER", yytext); }
 
=                                       { if(!COMMENT) printf("\n%s ASSIGNMENT OPERATOR", yytext); }
 
"=="|"<="|">="|"<"|">"                  { if(!COMMENT) printf("\n%s RELATIONAL OPERATOR", yytext); }
 
[ \t\n]+                                { /* ignore whitespace */ }
 
.                                       { /* ignore other characters */ }
 
%%
 
int main(int argc, char **argv) {
    FILE *file = fopen("input.c", "r");   // File to analyze
    if (!file) {
        printf
("Could not 
open the file\n"
);        exit(0);
    }
 
    yyin = file;   // Set input for lexer
    yylex();       // Start lexical analysis
    printf("\nLexical Analysis Complete.\n");
    return 0;
}
 
int yywrap() {
    return 1;
}
 
				JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCBDT01NRU5UID0gMDsgICAvLyBGbGFnIHRvIHRyYWNrIG11bHRpLWxpbmUgY29tbWVudHMKJX0KCmlkZW50aWZpZXIgW2EtekEtWl1bYS16QS1aMC05XSoKCiUlCgojLiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIlxuJXMgaXMgYSBQUkVQUk9DRVNTT1IgRElSRUNUSVZFIiwgeXl0ZXh0KTsgfQoKKGludHxmbG9hdHxjaGFyfGRvdWJsZXx3aGlsZXxmb3J8c3RydWN0fHR5cGVkZWZ8ZG98aWZ8YnJlYWt8Y29udGludWV8dm9pZHxzd2l0Y2h8cmV0dXJufGVsc2V8Z290bykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbnRmKCJcbiVzIGlzIGEgS0VZV09SRCIsIHl5dGV4dCk7IH0KCiIvKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IENPTU1FTlQgPSAxOyBwcmludGYoIlxuJXMgaXMgYSBDT01NRU5UIiwgeXl0ZXh0KTsgfQoiKi8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDT01NRU5UID0gMDsgcHJpbnRmKCJcbiVzIGVuZHMgQ09NTUVOVCIsIHl5dGV4dCk7IH0KCntpZGVudGlmaWVyfVwoICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmKCFDT01NRU5UKSBwcmludGYoIlxuJXMgRlVOQ1RJT04iLCB5eXRleHQpOyB9Cgp7aWRlbnRpZmllcn0oXFtbMC05XSpcXSk/ICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIElERU5USUZJRVIiLCB5eXRleHQpOyB9CgpceyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIEJMT0NLIEJFR0lOUyIsIHl5dGV4dCk7IH0KXH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBCTE9DSyBFTkRTIiwgeXl0ZXh0KTsgfQoKXDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBQVU5DVFVBVE9SIiwgeXl0ZXh0KTsgfQoKXCIuKlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBTVFJJTkciLCB5eXRleHQpOyB9CgpbMC05XSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBOVU1CRVIiLCB5eXRleHQpOyB9Cgo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIEFTU0lHTk1FTlQgT1BFUkFUT1IiLCB5eXRleHQpOyB9CgoiPT0ifCI8PSJ8Ij49InwiPCJ8Ij4iICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIFJFTEFUSU9OQUwgT1BFUkFUT1IiLCB5eXRleHQpOyB9CgpbIFx0XG5dKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgd2hpdGVzcGFjZSAqLyB9CgouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgb3RoZXIgY2hhcmFjdGVycyAqLyB9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBGSUxFICpmaWxlID0gZm9wZW4oImlucHV0LmMiLCAiciIpOyAgIC8vIEZpbGUgdG8gYW5hbHl6ZQogICAgaWYgKCFmaWxlKSB7CiAgICAgICAgcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiB0aGUgZmlsZVxuIik7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KCiAgICB5eWluID0gZmlsZTsgICAvLyBTZXQgaW5wdXQgZm9yIGxleGVyCiAgICB5eWxleCgpOyAgICAgICAvLyBTdGFydCBsZXhpY2FsIGFuYWx5c2lzCiAgICBwcmludGYoIlxuTGV4aWNhbCBBbmFseXNpcyBDb21wbGV0ZS5cbiIpOwogICAgcmV0dXJuIDA7Cn0KCmludCB5eXdyYXAoKSB7CiAgICByZXR1cm4gMTsKfQo=