/* program name is lexp.l */
%{
/* program to recognize a C program */
int COMMENT = 0;
%}
identifier [a-zA-Z][a-zA-Z0-9]*
%%
#.* {
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 IDENTIFIER", yytext);
}
\".*\" {
if (!COMMENT)
printf("\n\t%s is a STRING", yytext);
}
[0-9]+ {
if (!COMMENT)
printf("\n\t%s is a NUMBER", yytext);
}
\)(\;)? {
if (!COMMENT)
printf("\n\t");
ECHO;
printf("\n");
}
\( ECHO;
= {
if (!COMMENT)
printf("\n\t%s is an ASSIGNMENT OPERATOR", yytext);
}
\<=|\>=|\<|==|\> {
if (!COMMENT)
printf("\n\t%s is a RELATIONAL OPERATOR", yytext);
}
%%
int main(int argc, char **argv) {
if (argc > 1) {
FILE *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 0;
}
LyogcHJvZ3JhbSBuYW1lIGlzIGxleHAubCAqLwolewovKiBwcm9ncmFtIHRvIHJlY29nbml6ZSBhIEMgcHJvZ3JhbSAqLwppbnQgQ09NTUVOVCA9IDA7CiV9CgppZGVudGlmaWVyIFthLXpBLVpdW2EtekEtWjAtOV0qCgolJQoKIy4qIHsKICAgIHByaW50ZigiXG4lcyBpcyBhIFBSRVBST0NFU1NPUiBESVJFQ1RJVkUiLCB5eXRleHQpOwp9CgooaW50fGZsb2F0fGNoYXJ8ZG91YmxlfHdoaWxlfGZvcnxkb3xpZnxicmVha3xjb250aW51ZXx2b2lkfHN3aXRjaHxjYXNlfGxvbmd8c3RydWN0fGNvbnN0fHR5cGVkZWZ8cmV0dXJufGVsc2V8Z290bykgewogICAgcHJpbnRmKCJcblx0JXMgaXMgYSBLRVlXT1JEIiwgeXl0ZXh0KTsKfQoKIi8qIiB7CiAgICBDT01NRU5UID0gMTsKfQoKIiovIiB7CiAgICBDT01NRU5UID0gMDsKfQoKe2lkZW50aWZpZXJ9XCguKlwpIHsKICAgIGlmICghQ09NTUVOVCkKICAgICAgICBwcmludGYoIlxuXG5GVU5DVElPTlxuXHQlcyIsIHl5dGV4dCk7Cn0KClx7IHsKICAgIGlmICghQ09NTUVOVCkKICAgICAgICBwcmludGYoIlxuIEJMT0NLIEJFR0lOUyIpOwp9CgpcfSB7CiAgICBpZiAoIUNPTU1FTlQpCiAgICAgICAgcHJpbnRmKCJcbiBCTE9DSyBFTkRTIik7Cn0KCntpZGVudGlmaWVyfShcW1swLTldKlxdKT8gewogICAgaWYgKCFDT01NRU5UKQogICAgICAgIHByaW50ZigiXG4gJXMgSURFTlRJRklFUiIsIHl5dGV4dCk7Cn0KClwiLipcIiB7CiAgICBpZiAoIUNPTU1FTlQpCiAgICAgICAgcHJpbnRmKCJcblx0JXMgaXMgYSBTVFJJTkciLCB5eXRleHQpOwp9CgpbMC05XSsgewogICAgaWYgKCFDT01NRU5UKQogICAgICAgIHByaW50ZigiXG5cdCVzIGlzIGEgTlVNQkVSIiwgeXl0ZXh0KTsKfQoKXCkoXDspPyB7CiAgICBpZiAoIUNPTU1FTlQpCiAgICAgICAgcHJpbnRmKCJcblx0Iik7CiAgICBFQ0hPOwogICAgcHJpbnRmKCJcbiIpOwp9CgpcKCBFQ0hPOwoKPSB7CiAgICBpZiAoIUNPTU1FTlQpCiAgICAgICAgcHJpbnRmKCJcblx0JXMgaXMgYW4gQVNTSUdOTUVOVCBPUEVSQVRPUiIsIHl5dGV4dCk7Cn0KClw8PXxcPj18XDx8PT18XD4gewogICAgaWYgKCFDT01NRU5UKQogICAgICAgIHByaW50ZigiXG5cdCVzIGlzIGEgUkVMQVRJT05BTCBPUEVSQVRPUiIsIHl5dGV4dCk7Cn0KCiUlCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGlmIChhcmdjID4gMSkgewogICAgICAgIEZJTEUgKmZpbGU7CiAgICAgICAgZmlsZSA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CiAgICAgICAgaWYgKCFmaWxlKSB7CiAgICAgICAgICAgIHByaW50ZigiY291bGQgbm90IG9wZW4gJXMgXG4iLCBhcmd2WzFdKTsKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgeXlpbiA9IGZpbGU7CiAgICB9CiAgICB5eWxleCgpOwogICAgcHJpbnRmKCJcblxuIik7CiAgICByZXR1cm4gMDsKfQoKaW50IHl5d3JhcCgpIHsKICAgIHJldHVybiAwOwp9Cg==