%{
#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=