%{
#include <stdio.h>
#include <stdlib.h>
int COMMENT = 0; // Flag for 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("\nBLOCK BEGINS"); }
\} { if(!COMMENT) printf("\nBLOCK ENDS"); }
\; { if(!COMMENT) printf("\n%s PUNCTUATOR", yytext); }
\".*\" { if(!COMMENT) printf("\n%s STRING", yytext); }
{number} { if
(!COMMENT
) printf
("\n
%s NUMBER", yytext); }
= { if(!COMMENT) printf("\n%s ASSIGNMENT OPERATOR", yytext); }
"=="|"<="|">="|"<"|">" { if(!COMMENT) printf("\n%s RELATIONAL OPERATOR", yytext); }
"+"|"-"|"*"|"/" { if(!COMMENT) printf("\n%s ARITHMETIC OPERATOR", yytext); }
[ \t\n]+ { /* ignore whitespace */ }
. { /* ignore other characters */ }
%%
int main(int argc, char **argv) {
FILE
*file
= fopen
("
var.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+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCBDT01NRU5UID0gMDsgICAvLyBGbGFnIGZvciBtdWx0aS1saW5lIGNvbW1lbnRzCiV9CgppZGVudGlmaWVyIFthLXpBLVpfXVthLXpBLVowLTlfXSoKbnVtYmVyIFswLTldKwoKJSUKCiMuKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiXG4lcyBpcyBhIFBSRVBST0NFU1NPUiBESVJFQ1RJVkUiLCB5eXRleHQpOyB9CgooaW50fGZsb2F0fGNoYXJ8ZG91YmxlfHdoaWxlfGZvcnxzdHJ1Y3R8dHlwZWRlZnxkb3xpZnxicmVha3xjb250aW51ZXx2b2lkfHN3aXRjaHxyZXR1cm58ZWxzZXxnb3RvKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIlxuJXMgaXMgYSBLRVlXT1JEIiwgeXl0ZXh0KTsgfQoKIi8qIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQ09NTUVOVCA9IDE7IHByaW50ZigiXG4lcyBpcyBhIENPTU1FTlQiLCB5eXRleHQpOyB9CiIqLyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IENPTU1FTlQgPSAwOyBwcmludGYoIlxuJXMgZW5kcyBDT01NRU5UIiwgeXl0ZXh0KTsgfQoKe2lkZW50aWZpZXJ9XCggICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBGVU5DVElPTiIsIHl5dGV4dCk7IH0KCntpZGVudGlmaWVyfShcW1swLTldKlxdKT8gICAgICAgICAgICAgICB7IGlmKCFDT01NRU5UKSBwcmludGYoIlxuJXMgSURFTlRJRklFUiIsIHl5dGV4dCk7IH0KClx7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmKCFDT01NRU5UKSBwcmludGYoIlxuQkxPQ0sgQkVHSU5TIik7IH0KXH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG5CTE9DSyBFTkRTIik7IH0KClw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmKCFDT01NRU5UKSBwcmludGYoIlxuJXMgUFVOQ1RVQVRPUiIsIHl5dGV4dCk7IH0KClwiLipcIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmKCFDT01NRU5UKSBwcmludGYoIlxuJXMgU1RSSU5HIiwgeXl0ZXh0KTsgfQoKe251bWJlcn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYoIUNPTU1FTlQpIHByaW50ZigiXG4lcyBOVU1CRVIiLCB5eXRleHQpOyB9Cgo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIEFTU0lHTk1FTlQgT1BFUkFUT1IiLCB5eXRleHQpOyB9CgoiPT0ifCI8PSJ8Ij49InwiPCJ8Ij4iICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIFJFTEFUSU9OQUwgT1BFUkFUT1IiLCB5eXRleHQpOyB9CgoiKyJ8Ii0ifCIqInwiLyIgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZighQ09NTUVOVCkgcHJpbnRmKCJcbiVzIEFSSVRITUVUSUMgT1BFUkFUT1IiLCB5eXRleHQpOyB9CgpbIFx0XG5dKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgd2hpdGVzcGFjZSAqLyB9CgouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBpZ25vcmUgb3RoZXIgY2hhcmFjdGVycyAqLyB9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBGSUxFICpmaWxlID0gZm9wZW4oInZhci5jIiwgInIiKTsgICAvLyBGaWxlIHRvIGFuYWx5emUKICAgIGlmICghZmlsZSkgewogICAgICAgIHByaW50ZigiQ291bGQgbm90IG9wZW4gdGhlIGZpbGVcbiIpOwogICAgICAgIGV4aXQoMCk7CiAgICB9CgogICAgeXlpbiA9IGZpbGU7ICAgLy8gU2V0IGlucHV0IGZvciBsZXhlcgogICAgeXlsZXgoKTsgICAgICAgLy8gU3RhcnQgbGV4aWNhbCBhbmFseXNpcwogICAgcHJpbnRmKCJcbkxleGljYWwgQW5hbHlzaXMgQ29tcGxldGUuXG4iKTsKICAgIHJldHVybiAwOwp9CgppbnQgeXl3cmFwKCkgewogICAgcmV0dXJuIDE7Cn0K