%{
/* program to recognize a C program */
#include <stdio.h>
#include <stdlib.h>
int COMMENT = 0;
%}
identifier [a-zA-Z_][a-zA-Z0-9_]*
string "\".*\""
relop (<=|>=|<|==|>)
assignment =
%%
#.* { printf("\n%s is a PREPROCESSOR DIRECTIVE", yytext); }
int
|float|char
|double
|while
|for
|do
|if
|break
|continue
|void
|switch
|case
|long
|struct
|const
|typedef
|return
|else
|goto
{ printf("\n\t%s is a KEYWORD", yytext); }
"/*" { COMMENT = 1; }
"*/" { COMMENT = 0; }
{identifier}\( { if (!COMMENT) printf("\n\nFUNCTION\n\t%s", yytext); }
"{" { if (!COMMENT) printf("\n BLOCK BEGINS"); }
"}" { if (!COMMENT) printf("\n BLOCK ENDS"); }
{identifier}(\[[0-9]*\])? { if (!COMMENT) printf("\n %s is an IDENTIFIER", yytext); }
{string} { if (!COMMENT) printf("\n\t%s is a STRING", yytext); }
{number} { if
(!COMMENT
) printf
("\n\t
%s is a NUMBER", yytext); } {assignment} { if (!COMMENT) printf("\n\t%s is an ASSIGNMENT OPERATOR", yytext); }
{relop} { if (!COMMENT) printf("\n\t%s is a RELATIONAL OPERATOR", yytext); }
. { if (!COMMENT) printf("\n\t"); ECHO; printf("\n"); }
%%
int main(int argc, char **argv) {
if (argc > 1) {
FILE *file = fopen(argv[1], "r");
if (!file) {
printf
("Could not
open %s \n", argv[1]); exit(0);
}
yyin = file;
}
yylex();
printf("\n\n");
return 0;
}
int yywrap() {
return 1;
}
JXsKLyogcHJvZ3JhbSB0byByZWNvZ25pemUgYSBDIHByb2dyYW0gKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KaW50IENPTU1FTlQgPSAwOwolfQoKaWRlbnRpZmllciAgICAgW2EtekEtWl9dW2EtekEtWjAtOV9dKgpudW1iZXIgICAgICAgICBbMC05XSsKc3RyaW5nICAgICAgICAgIlwiLipcIiIKcmVsb3AgICAgICAgICAgKDw9fD49fDx8PT18PikKYXNzaWdubWVudCAgICAgPQoKJSUKIy4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmludGYoIlxuJXMgaXMgYSBQUkVQUk9DRVNTT1IgRElSRUNUSVZFIiwgeXl0ZXh0KTsgfQoKaW50fGZsb2F0fGNoYXJ8ZG91YmxlfHdoaWxlfGZvcnxkb3xpZnxicmVha3xjb250aW51ZXx2b2lkfHN3aXRjaHxjYXNlfGxvbmd8c3RydWN0fGNvbnN0fHR5cGVkZWZ8cmV0dXJufGVsc2V8Z290bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW50ZigiXG5cdCVzIGlzIGEgS0VZV09SRCIsIHl5dGV4dCk7IH0KCiIvKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IENPTU1FTlQgPSAxOyB9CiIqLyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IENPTU1FTlQgPSAwOyB9CntpZGVudGlmaWVyfVwoICAgICAgICAgICAgICAgICAgICB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcblxuRlVOQ1RJT05cblx0JXMiLCB5eXRleHQpOyB9CiJ7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcbiBCTE9DSyBCRUdJTlMiKTsgfQoifSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG4gQkxPQ0sgRU5EUyIpOyB9CntpZGVudGlmaWVyfShcW1swLTldKlxdKT8gICAgICAgICB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcbiAlcyBpcyBhbiBJREVOVElGSUVSIiwgeXl0ZXh0KTsgfQp7c3RyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG5cdCVzIGlzIGEgU1RSSU5HIiwgeXl0ZXh0KTsgfQp7bnVtYmVyfSAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG5cdCVzIGlzIGEgTlVNQkVSIiwgeXl0ZXh0KTsgfQp7YXNzaWdubWVudH0gICAgICAgICAgICAgICAgICAgICAgeyBpZiAoIUNPTU1FTlQpIHByaW50ZigiXG5cdCVzIGlzIGFuIEFTU0lHTk1FTlQgT1BFUkFUT1IiLCB5eXRleHQpOyB9CntyZWxvcH0gICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmICghQ09NTUVOVCkgcHJpbnRmKCJcblx0JXMgaXMgYSBSRUxBVElPTkFMIE9QRVJBVE9SIiwgeXl0ZXh0KTsgfQoKLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWYgKCFDT01NRU5UKSBwcmludGYoIlxuXHQiKTsgRUNITzsgcHJpbnRmKCJcbiIpOyB9CgolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBpZiAoYXJnYyA+IDEpIHsKICAgICAgICBGSUxFICpmaWxlID0gZm9wZW4oYXJndlsxXSwgInIiKTsKICAgICAgICBpZiAoIWZpbGUpIHsKICAgICAgICAgICAgcHJpbnRmKCJDb3VsZCBub3Qgb3BlbiAlcyBcbiIsIGFyZ3ZbMV0pOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgICAgICB5eWluID0gZmlsZTsKICAgIH0KICAgIHl5bGV4KCk7CiAgICBwcmludGYoIlxuXG4iKTsKICAgIHJldHVybiAwOwp9CgppbnQgeXl3cmFwKCkgewogICAgcmV0dXJuIDE7Cn0K