%option noyywrap
%{
#include <stdio.h>
// Start condition states
%}
%x PREINC PREDEC POSTINC POSTDEC
DIGIT [0-9]
ID [a-zA-Z_][a-zA-Z0-9_]*
KEYWORD "for"|"int"|"float"|"char"|"if"|"else"|"while"|"return"|"void"
PUNCT ";"|"{"|"}"|","
INT_CONST {DIGIT}+
FLOAT_CONST {DIGIT}+"."{DIGIT}+
STR_LITERAL \"([^\\\"]|\\.)*\"
CHAR_LITERAL \'([^\\\']|\\.)\'
PARANTHESIS "("
CLOS ")"
%%
{KEYWORD} { printf("Keyword: %s\n", yytext); }
"++" { BEGIN(PREINC); return 0; }
"--" { BEGIN(PREDEC); return 0; }
{ID}"++" { printf("Post Increment: %s\n", yytext); return 0; }
{ID}"--" { printf("Post Decrement: %s\n", yytext); return 0; }
<PREINC>{ID} { printf("Pre Increment: ++%s\n", yytext); BEGIN(INITIAL); return 0; }
<PREDEC>{ID} { printf("Pre Decrement: --%s\n", yytext); BEGIN(INITIAL); return 0; }
{FLOAT_CONST} { printf("Float Constant: %s\n", yytext); }
{INT_CONST} { printf("Integer Constant: %s\n", yytext); }
{STR_LITERAL} { printf("String Literal: %s\n", yytext); }
{CHAR_LITERAL} { printf("Character Literal: %s\n", yytext); }
"=="|"!="|"="|"<="|">="|"<"|">" { printf("Relational Operator: %s\n", yytext); }
"*"|"/"|"+"|"-" { printf("Arithmetic Operator: %s\n", yytext); }
{PUNCT} { printf("Punctuator: %s\n", yytext); }
{ID} { printf("Identifier: %s\n", yytext); }
[ \t\n] ; // ignore whitespaces
. { printf("Unrecognized: %s\n", yytext); }
%%
int main() {
printf("Enter C-style code:\n");
yylex();
return 0;
}
JW9wdGlvbiBub3l5d3JhcAoKJXsKI2luY2x1ZGUgPHN0ZGlvLmg+CgovLyBTdGFydCBjb25kaXRpb24gc3RhdGVzCiV9CgoleCBQUkVJTkMgUFJFREVDIFBPU1RJTkMgUE9TVERFQwoKRElHSVQgICAgICAgIFswLTldCklEICAgICAgICAgICBbYS16QS1aX11bYS16QS1aMC05X10qCktFWVdPUkQgICAgICAiZm9yInwiaW50InwiZmxvYXQifCJjaGFyInwiaWYifCJlbHNlInwid2hpbGUifCJyZXR1cm4ifCJ2b2lkIgpQVU5DVCAgICAgICAgIjsifCJ7InwifSJ8IiwiCklOVF9DT05TVCAgICB7RElHSVR9KwpGTE9BVF9DT05TVCAge0RJR0lUfSsiLiJ7RElHSVR9KwpTVFJfTElURVJBTCAgXCIoW15cXFwiXXxcXC4pKlwiCkNIQVJfTElURVJBTCBcJyhbXlxcXCddfFxcLilcJwpQQVJBTlRIRVNJUyAgIigiCkNMT1MgICAgICAgICAiKSIKCiUlCgp7S0VZV09SRH0gICAgICAgICAgICAgeyBwcmludGYoIktleXdvcmQ6ICVzXG4iLCB5eXRleHQpOyB9CgoiKysiICAgICAgICAgICAgICAgICAgeyBCRUdJTihQUkVJTkMpOyByZXR1cm4gMDsgfQoiLS0iICAgICAgICAgICAgICAgICAgeyBCRUdJTihQUkVERUMpOyByZXR1cm4gMDsgfQp7SUR9IisrIiAgICAgICAgICAgICAgeyBwcmludGYoIlBvc3QgSW5jcmVtZW50OiAlc1xuIiwgeXl0ZXh0KTsgcmV0dXJuIDA7IH0Ke0lEfSItLSIgICAgICAgICAgICAgIHsgcHJpbnRmKCJQb3N0IERlY3JlbWVudDogJXNcbiIsIHl5dGV4dCk7IHJldHVybiAwOyB9Cgo8UFJFSU5DPntJRH0gICAgICAgICAgeyBwcmludGYoIlByZSBJbmNyZW1lbnQ6ICsrJXNcbiIsIHl5dGV4dCk7IEJFR0lOKElOSVRJQUwpOyByZXR1cm4gMDsgfQo8UFJFREVDPntJRH0gICAgICAgICAgeyBwcmludGYoIlByZSBEZWNyZW1lbnQ6IC0tJXNcbiIsIHl5dGV4dCk7IEJFR0lOKElOSVRJQUwpOyByZXR1cm4gMDsgfQoKe0ZMT0FUX0NPTlNUfSAgICAgICAgIHsgcHJpbnRmKCJGbG9hdCBDb25zdGFudDogJXNcbiIsIHl5dGV4dCk7IH0Ke0lOVF9DT05TVH0gICAgICAgICAgIHsgcHJpbnRmKCJJbnRlZ2VyIENvbnN0YW50OiAlc1xuIiwgeXl0ZXh0KTsgfQp7U1RSX0xJVEVSQUx9ICAgICAgICAgeyBwcmludGYoIlN0cmluZyBMaXRlcmFsOiAlc1xuIiwgeXl0ZXh0KTsgfQp7Q0hBUl9MSVRFUkFMfSAgICAgICAgeyBwcmludGYoIkNoYXJhY3RlciBMaXRlcmFsOiAlc1xuIiwgeXl0ZXh0KTsgfQoKIj09InwiIT0ifCI9InwiPD0ifCI+PSJ8IjwifCI+IiB7IHByaW50ZigiUmVsYXRpb25hbCBPcGVyYXRvcjogJXNcbiIsIHl5dGV4dCk7IH0KIioifCIvInwiKyJ8Ii0iICAgICAgICAgICAgICAgICB7IHByaW50ZigiQXJpdGhtZXRpYyBPcGVyYXRvcjogJXNcbiIsIHl5dGV4dCk7IH0KCntQVU5DVH0gICAgICAgICAgICAgIHsgcHJpbnRmKCJQdW5jdHVhdG9yOiAlc1xuIiwgeXl0ZXh0KTsgfQp7SUR9ICAgICAgICAgICAgICAgICB7IHByaW50ZigiSWRlbnRpZmllcjogJXNcbiIsIHl5dGV4dCk7IH0KWyBcdFxuXSAgICAgICAgICAgICAgOyAgLy8gaWdub3JlIHdoaXRlc3BhY2VzCgouICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiVW5yZWNvZ25pemVkOiAlc1xuIiwgeXl0ZXh0KTsgfQoKJSUKCmludCBtYWluKCkgewogICAgcHJpbnRmKCJFbnRlciBDLXN0eWxlIGNvZGU6XG4iKTsKICAgIHl5bGV4KCk7CiAgICByZXR1cm4gMDsKfQo=