Lex program to recognize tokens from C program

, by Prashant Gunjal

%{
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int flag=0,found=0,var_cnt=0,i;
struct holder
{
char name[10];
int val;
}st[20];
%}

nl [\n]+
ws [ \t]+
no [0-9]
kwd main|int|char|float|double|if|while|do|for|void
var [a-zA-Z][a-zA-Z0-9]*
cnst [\-]?[0-9]+[\.]?[0-9]*
ariop [+*\-\/]
ariop1 [+*\-\/]=
relop >|<|<=|>=|!=
ass =
fun main|printf|scanf|strlen|strcpy
prest #
ignore [{}()"",&;]

%%
{nl} {flag=0;}
{ws} {;}
{ignore} {;}
^# {flag=1; fprintf(yyout,"\n\t\tPreprocessor Statement\t\t");}
{kwd} {if(!flag) fprintf(yyout,"\n%s\t\tKEYWORD\t\t\t\t***",yytext);}
{ass} {if(!flag) fprintf(yyout,"\n%s\t\tASSIGNMENT OPERATOR\t\t***",yytext);}
{cnst} {if(!flag) fprintf(yyout,"\n%s\t\tCONSTANT\t\t\t***",yytext);}
{relop} {if(!flag) fprintf(yyout,"\n%s\t\tRELATIONAL OPERATOR\t\t***",yytext);}
{ariop} {if(!flag) fprintf(yyout,"\n%s\t\tARITHMATIC OPERATOR\t\t***",yytext);}
{ariop1} {if(!flag) fprintf(yyout,"\n%s\t\tARITHMATIC OPERATOR\t\t***",yytext);}
{var} { if(!flag)
{ for(i=0;i<var_cnt;i++)
if(strcmp(st[i].name,yytext)==0)
break; //already present variable

if(i==var_cnt) //indicate new var encounter so insert in struct
strcpy(st[var_cnt++].name,yytext);
fprintf(yyout,"\n%s\t\t Variable\t\t(%d)",yytext,i);

}
}
%%

int main()
{
yyin=fopen("a.c","r");
yyout=fopen("out.txt","w");
fprintf(yyout,"\nLexeme\t\tToken\t\tAttribute Value");
yylex();
fclose(yyout);
}
int yywrap()
{
return(1);
}


######input file a.c ##########

#include<stdio.h>
int main()
{
int a=0,b,c;
a=b+c;
a+=1;
a-=2.2;
}

##########################

#### OUTPUT ###########


Lexeme Token Attribute Value
Preprocessor Statement .
int KEYWORD ***
main Variable (0)
int KEYWORD ***
a Variable (1)
= ASSIGNMENT OPERATOR ***
0 CONSTANT ***
b Variable (2)
c Variable (3)
a Variable (1)
= ASSIGNMENT OPERATOR ***
b Variable (2)
+ ARITHMATIC OPERATOR ***
c Variable (3)
a Variable (1)
+= ARITHMATIC OPERATOR ***
1 CONSTANT ***
a Variable (1)
-= ARITHMATIC OPERATOR ***
2.2 CONSTANT ***

0 comments: