PROGRAM
file name a3.l
%{
#include<stdio.h>
#include<string.h>
char err[20][50],name[20][20];
int lno=1,cnt=0,ecnt=0,elno[20];
%}
%%
[0-9]+ {printf("%d %s Number\n",lno,yytext);}
[+-/*] {printf("%d %s Operator\n",lno,yytext);}
= {printf("%d %s Assignment\n",lno,yytext);}
main|return|include {printf("%d %s Keyword\n",lno,yytext);}
int|double|char|float {printf("%d %s Data type\n",lno,yytext);}
[\t ] ;
\n {lno++;}
(\/\/.*) ;
(\/\*[^*/]*\*\/) ;
(\/\*[^*/]*) {elno[ecnt]=lno;char str[100]="Unterminated comment";strcpy(err[ecnt],str);ecnt++;}
printf|scanf {printf("%d %s Library function\n",lno,yytext);}
[a-z]+[a-zA-Z0-9]* {printf("%d %s Identifier\n",lno,yytext);st_add(yytext);}
([a-zA-Z0-9]+\.h) {printf("%d %s Header\n",lno,yytext);}
\( {printf("%d %s Open bracket\n",lno,yytext);}
\) {printf("%d %s Close bracket\n",lno,yytext);}
\< {printf("%d %s Less than\n",lno,yytext);}
\> {printf("%d %s Greater than\n",lno,yytext);}
\{ {printf("%d %s Block start\n",lno,yytext);}
\} {printf("%d %s Block end\n",lno,yytext);}
# {printf("%d %s Preprocessor\n",lno,yytext);}
; {printf("%d %s Terminator\n",lno,yytext);}
(\"[^\"]*\") {printf("%d %s String literal\n",lno,yytext);}
(\"[^\"\n]*\n) {elno[ecnt]=lno;char str[100]="Unterminated quote";strcpy(err[ecnt],str);ecnt++;lno++;}
[0-9]+[a-zA-z]* {elno[ecnt]=lno;char str[100]="Unrecognized token";strcpy(err[ecnt],str);ecnt++;}
%%
void st_add(char s[20])
{
int i;
for(i=0;i<cnt;i++)
{
if(strcmp(name[i],s)==0)
return;
}
strcpy(name[cnt],s);
cnt++;
}
main()
{
char file[20];
printf("Enter file name:");
scanf("%s",file);
yyin=fopen(file,"r");
printf("Line No. Lexeme Token\n");
yylex();
printf("Number of errors: %d\n",ecnt);
int i=0;
for(i=0;i<ecnt;i++)
printf("Line no.: %2d %s\n",elno[i],err[i]);
printf("Symbol Table\n");
for(i=0;i<cnt;i++)
printf("%s\n",name[i]);
return 0;
}
int yywrap()
{
return 1;
}
main.c
#include<stdio.h>
int main()
{
6s
int a = 1;
float b=0;
printf(");
return 0;
/*
}
OUTPUT
[amodi@localhost ~]$ lex a3.l
[amodi@localhost ~]$ gcc lex.yy.c
a3.l:36:6: warning: conflicting types for ‘st_add’ [enabled by default]
{
^
a3.l:20:42: note: previous implicit declaration of ‘st_add’ was here
[a-z]+[a-zA-Z0-9]* {printf("%d %s Identifier\n",lno,yytext);st_add(yytext);}
^
[amodi@localhost ~]$ ./a.out
Enter file name:main.c
Line No. Lexeme Token
1 # Preprocessor
1 include Keyword
1 < Less than
1 stdio.h Header
1 > Greater than
2 int Data type
2 main Keyword
2 ( Open bracket
2 ) Close bracket
3 { Block start
5 int Data type
5 a Identifier
5 = Assignment
5 1 Number
5 ; Terminator
6 float Data type
6 b Identifier
6 = Assignment
6 0 Number
6 ; Terminator
7 printf Library function
7 ( Open bracket
8 return Keyword
8 0 Number
8 ; Terminator
Number of errors: 3
Line no.: 4 Unrecognized token
Line no.: 7 Unterminated quote
Line no.: 9 Unterminated comment
Symbol Table
a
b
file name a3.l
%{
#include<stdio.h>
#include<string.h>
char err[20][50],name[20][20];
int lno=1,cnt=0,ecnt=0,elno[20];
%}
%%
[0-9]+ {printf("%d %s Number\n",lno,yytext);}
[+-/*] {printf("%d %s Operator\n",lno,yytext);}
= {printf("%d %s Assignment\n",lno,yytext);}
main|return|include {printf("%d %s Keyword\n",lno,yytext);}
int|double|char|float {printf("%d %s Data type\n",lno,yytext);}
[\t ] ;
\n {lno++;}
(\/\/.*) ;
(\/\*[^*/]*\*\/) ;
(\/\*[^*/]*) {elno[ecnt]=lno;char str[100]="Unterminated comment";strcpy(err[ecnt],str);ecnt++;}
printf|scanf {printf("%d %s Library function\n",lno,yytext);}
[a-z]+[a-zA-Z0-9]* {printf("%d %s Identifier\n",lno,yytext);st_add(yytext);}
([a-zA-Z0-9]+\.h) {printf("%d %s Header\n",lno,yytext);}
\( {printf("%d %s Open bracket\n",lno,yytext);}
\) {printf("%d %s Close bracket\n",lno,yytext);}
\< {printf("%d %s Less than\n",lno,yytext);}
\> {printf("%d %s Greater than\n",lno,yytext);}
\{ {printf("%d %s Block start\n",lno,yytext);}
\} {printf("%d %s Block end\n",lno,yytext);}
# {printf("%d %s Preprocessor\n",lno,yytext);}
; {printf("%d %s Terminator\n",lno,yytext);}
(\"[^\"]*\") {printf("%d %s String literal\n",lno,yytext);}
(\"[^\"\n]*\n) {elno[ecnt]=lno;char str[100]="Unterminated quote";strcpy(err[ecnt],str);ecnt++;lno++;}
[0-9]+[a-zA-z]* {elno[ecnt]=lno;char str[100]="Unrecognized token";strcpy(err[ecnt],str);ecnt++;}
%%
void st_add(char s[20])
{
int i;
for(i=0;i<cnt;i++)
{
if(strcmp(name[i],s)==0)
return;
}
strcpy(name[cnt],s);
cnt++;
}
main()
{
char file[20];
printf("Enter file name:");
scanf("%s",file);
yyin=fopen(file,"r");
printf("Line No. Lexeme Token\n");
yylex();
printf("Number of errors: %d\n",ecnt);
int i=0;
for(i=0;i<ecnt;i++)
printf("Line no.: %2d %s\n",elno[i],err[i]);
printf("Symbol Table\n");
for(i=0;i<cnt;i++)
printf("%s\n",name[i]);
return 0;
}
int yywrap()
{
return 1;
}
main.c
#include<stdio.h>
int main()
{
6s
int a = 1;
float b=0;
printf(");
return 0;
/*
}
OUTPUT
[amodi@localhost ~]$ lex a3.l
[amodi@localhost ~]$ gcc lex.yy.c
a3.l:36:6: warning: conflicting types for ‘st_add’ [enabled by default]
{
^
a3.l:20:42: note: previous implicit declaration of ‘st_add’ was here
[a-z]+[a-zA-Z0-9]* {printf("%d %s Identifier\n",lno,yytext);st_add(yytext);}
^
[amodi@localhost ~]$ ./a.out
Enter file name:main.c
Line No. Lexeme Token
1 # Preprocessor
1 include Keyword
1 < Less than
1 stdio.h Header
1 > Greater than
2 int Data type
2 main Keyword
2 ( Open bracket
2 ) Close bracket
3 { Block start
5 int Data type
5 a Identifier
5 = Assignment
5 1 Number
5 ; Terminator
6 float Data type
6 b Identifier
6 = Assignment
6 0 Number
6 ; Terminator
7 printf Library function
7 ( Open bracket
8 return Keyword
8 0 Number
8 ; Terminator
Number of errors: 3
Line no.: 4 Unrecognized token
Line no.: 7 Unterminated quote
Line no.: 9 Unterminated comment
Symbol Table
a
b
No comments:
Post a Comment