This is a simple token generation program written using lex.
#include<stdio.h>
int main(){
int a =0;
printf("Hello World");
return 0;
}
[duke@duke-pc a3]$ gcc lex.yy.c
[duke@duke-pc a3]$ ./a.out file.c
LINE LEXME TOKEN
1 #include<stdio.h> PREPROCESSOR
2 int DATATYPE
2 main KEYWORD
2 ( BRACKET OPEN
2 ) BRACKET CLOSE
2 { BRACE OPEN
3 int DATATYPE
3 a IDENTIFIER
3 = ASSIGNMENT
3 0 INTEGER
3 ; TERMINATOR
4 printf IDENTIFIER
4 ( BRACKET OPEN
4 "Hello World" STRING CONSTANT
4 ) BRACKET CLOSE
4 ; TERMINATOR
5 return KEYWORD
5 0 INTEGER
5 ; TERMINATOR
6 } BRACE CLOSE
[duke@duke-pc a3]$
Code
%{ %} letter [a-zA-z] digit [0-9] %% \n yylineno++; #include<{letter}+(\.{letter}*)?> printf("%d\t%s\tPREPROCESSOR\n",yylineno,yytext); return|main|for|while|case|switch|if|else printf("%d\t%s\tKEYWORD\n",yylineno,yytext); int|float|char|struct printf("%d\t%s\tDATATYPE\n",yylineno,yytext); \( printf("%d\t%s\tBRACKET OPEN\n",yylineno,yytext); \) printf("%d\t%s\tBRACKET CLOSE\n",yylineno,yytext); {letter}({letter}|{digit})* printf("%d\t%s\tIDENTIFIER\n",yylineno,yytext); {digit}+ printf("%d\t%s\tINTEGER\n",yylineno,yytext); \{ printf("%d\t%s\tBRACE OPEN\n",yylineno,yytext); \} printf("%d\t%s\tBRACE CLOSE\n",yylineno,yytext); {digit}+"E"(\+|\-)?{digit}+ printf("%d\t%s\tREAL NUMBER\n",yylineno,yytext); {digit}+\.{digit}+(E(\+|\-)?{digit}+)? printf("%d\t%s\tFLOATING NUMBER\n",yylineno,yytext); = printf("%d\t%s\tASSIGNMENT\n",yylineno,yytext); ; printf("%d\t%s\tTERMINATOR\n",yylineno,yytext); \t ; " " ; \"({letter}|{digit}|" ")*\" printf("%d\t%s\tSTRING CONSTANT\n",yylineno,yytext); %% int yywrap(){ return 1; } int main(int argc, char * argv[]){ yyin=fopen(argv[1],"r"); printf("LINE\tLEXME\tTOKEN\n"); yylex(); fclose(yyin); return 0; }
Input File
#include<stdio.h>
int main(){
int a =0;
printf("Hello World");
return 0;
}
Output
[duke@duke-pc a3]$ lex lex.lex[duke@duke-pc a3]$ gcc lex.yy.c
[duke@duke-pc a3]$ ./a.out file.c
LINE LEXME TOKEN
1 #include<stdio.h> PREPROCESSOR
2 int DATATYPE
2 main KEYWORD
2 ( BRACKET OPEN
2 ) BRACKET CLOSE
2 { BRACE OPEN
3 int DATATYPE
3 a IDENTIFIER
3 = ASSIGNMENT
3 0 INTEGER
3 ; TERMINATOR
4 printf IDENTIFIER
4 ( BRACKET OPEN
4 "Hello World" STRING CONSTANT
4 ) BRACKET CLOSE
4 ; TERMINATOR
5 return KEYWORD
5 0 INTEGER
5 ; TERMINATOR
6 } BRACE CLOSE
[duke@duke-pc a3]$
I did this program but it's showing some error like yylineno undeclared
ReplyDelete