Trinity College of Engg & Technology: 1) A Program To Design Lexical Analyzer
Trinity College of Engg & Technology: 1) A Program To Design Lexical Analyzer
==0||strcmp(“switch”,str)==0||strcmp(“case”,str)==0)
Printf(“\n%s is a keyword”,str);
else
printf(“\n%s is an identifier",str);
}
main()
{
FILE *f1,*f2,*f3;
char c,str[10],st1[10];
int num[100],lineno=0,tokenvalue=0,i=0,j=0,k=0;
printf("\nEnter the c program");/*gets(st1);*/
f1=fopen("input","w");
while((c=getchar()!=EOF)
put(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF))
{
if(isdigit(c))
{
tokenvalue=c-'0';
c=getc(f1);
while(isdigit(c))
{
tokenvalue*=10+c-'0';
c=getc(f1);
}
num[i++]=tokenvalue;
ungetc(c,f1);
}elseif(isalpha(c))
{
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='S')
{
putc(c,f2);
c=getc(f1);
}
putc('',f2);
ungetc(c,f1);
Compiler Design Lab Page 1
TRINITY COLLEGE OF ENGG & TECHNOLOGY
}else if(c==''||c=='\t')
printf("");
else if(c=='\n')
lineno++;
else
putc(c,f3);
}
fclose(f2);
fclose(f3);
fclose(f1);
printf("\nThe no's in the program are");
for(j=0;j<i;j++)
printf("%d",num[j]);
printf("\n");
f2=fopen("identifier","r");
k=0;
printf("The keywords and identifiers are:");
while((c=getc(f2))!=EOF)
{
if(c!='')
str[k++]=c;
else
{
str[k]='\0';
keyword(str);
k=0;
}
}
fclose(f2);
f3=fopen("specialchar","r");
printf("\nSpecial characters are");
while((c=getc(f3))!=EOF)
printf("%c",c);
printf("\n");
fclose(f3);
printf("Total no. of lines are:%d",lineno);
}
Output:
Enter the C program
a+b*c
Ctrl-D
The no's in the program are:
The keywords and identifiers are:
a is an identifier and terminal
b is an identifier and terminal
c is an identifier and terminal
special characters are:
+*
Total no. of lines are:1
Compiler Design Lab Page 2
TRINITY COLLEGE OF ENGG & TECHNOLOGY
\(ECHO;
={if(!COMMENT)printf("\n\t%s is an ASSIGNMENT OPERATOR",yytext);}
\<= |
\>= |
\< |
== |
Compiler Design Lab Page 3
TRINITY COLLEGE OF ENGG & TECHNOLOGY
Input:
Svi var.c
main()
{
int a,b;
}
Output:
Slex lex.l
Scc lex.yy.c
S./a.out var.c
#include<stdio.h>is a PREPROCESSOR DIRECTIVE
FUNCTION
main()
BLOCK BEGINS
int is a KEYWORD
a IDENTIFIER b IDENTIFIER BLOCK ENDS
KEYWORD,"char",KEYWORD,"struct",KEYWORD,"return",KEYWORD,0,0};
void Error_Message(char *m)
{
fprintf(stderr,"line %d,%s\n",lineno,m);
exit(1);
}int look_up(char s[])
{
int k;
for(k=lastentry;k>0;k--)
if(strcmp(symtable[k].lexptr,s)==0)
return k;
return 0;
}int insert(char s[],int tok)
{
int len;
len=strlen(s);
if(lastentry+1>=MAX)
Error_Message("Symbol table is full");
if(lastchar+len+1>=MAX)
Error_Message("Lexemes array is full");
lastentry=lastentry+1;
Compiler Design Lab Page 5
TRINITY COLLEGE OF ENGG & TECHNOLOGY
symtable[lastentry].token=tok;
symtable[lastentry].lexptr=&lexemes[lastchar+1];
lastchar=lastchar+len+1;
strcpy(symtable[lastentry].lexptr,s);
return lastentry;
}/*void Initialize()
{
struct entry *ptr;
for(ptr=keywords;ptr->token;ptr+1)
insert(ptr->lexptr,ptr->token);
}*/
int lexer()
{
int t;
int val,i=0;
while(1)
{
t=getchar();
if(t==''||t--'\t');
else if(t=='\n')
lineno=lineno+1;
else if(isdigit(t))
{
ungetc(t,stdin);
scanf("%d",&tokenval);
return NUM;
}
else if(isalph(t))
{
while(isalnum(t))
{
buffer[i]=t;
t=getchar();
i=i+1;
if(i>=SIZE)
Error_Message("Compiler error");
}
buffer[i]=EOS;
if(t!=EOF)
unget(t,stdin);
val=look_up(buffer);
if(val==0)
val=insert(buffer,ID);
tokenval=val;
return symtable[val].token;
}
else if(t==EOF)
return DONE;
else
{
Compiler Design Lab Page 6
TRINITY COLLEGE OF ENGG & TECHNOLOGY
tokenval=NONE;
return t;
}
}
}
void Match(int t)
{
if(lookahead==t)
lookahead=lexer();
else
Error_Message("Syntax error");
}
void display(int t,int tval)
{
if(t=='+'||t=='-'||t=='*'||t=='/')
printf("\nArithmetic Operator:%c",t);
else if(t==NUM)
printf("\nNumber:%d",tval);
else if(t==ID)
printf("\nIdentifier: %s",symtable[tval].lexptr);
else
printf("\nToken %d tokenval %d",t,tokenval);
}
void F()
{
//void E();
switch(lookahead)
{
case'(':Match('(');
E();
Match(')');
break;
case NUM:display(NUM,tokenval);
Match(NUM);break;
case ID:display(ID,tokenval);
Match(ID);
break;
default:Error_Message("Syntax error");
}
}
void T()
{
int t;
F();
while(1)
{
switch(lookahead)
{
case '*':t=lookahead;
Compiler Design Lab Page 7
TRINITY COLLEGE OF ENGG & TECHNOLOGY
Match(lookahead);
F();
display(t,NONE);
continue;
case '/':t=lookahead;
Match(lookahead);
display(t,NONE);
continue;
default:return;
}
}
}
void E()
{
int t;
T();
while(1)
{
switch(lookahead)
{
case'+':t=lookahead;
Match(lookahead);
T();
display(t,NONE);
continue;
case '-':t=lookahead;
Match(lookahead);
T();
display(t,NONE);
continue;
default:return;
}
}
}
void parser()
{
lookahead=lexer();
while(looakahead!=DONE)
{
E();
Match(';');
}}
main()
{
char ans[10];
printf("\nProgram for recursive decent parsing");
printf("\n Enter the expression");
printf("And place;at the end\n");
printf("Press Ctrl-Z to terminate\n");
parser(); }
Compiler Design Lab Page 8
TRINITY COLLEGE OF ENGG & TECHNOLOGY
Output:
Program for recursive decent parsing
Enter the expression And place;at the end
Press Ctrl-Z to terminate
a+b*c;
Identifier:a
Identifier:b
Identifier:c
Arithmetic Operator:*
Arithmetic Operator:+
2*3;
Number:2
Number:3
Arithmetic Operator:*
+3;
line 5,Syntax error
Ctrl-Z
Output:
Slex parser.1
Syacc -d parser.y
Scc lex.yy.c.y.tab.c -ll -lm
S./a.out
2+3
5.0000
5) Convert the BNF rules into Yacc form and write code to generate abstract syntax tree.
<int.l>
%{
#include"y.tab.h"
#include<stdio.h>
#include<string.h>
int LineNo=1;
%}
identifier [a-zA-Z][_a-zA-Z0-9]*
number [0-9]+|([0-9]*\.[0-9]+)
%%
main\(\)return MAIN;
if return IF;
else return ELSE;
while return WHILE;
int |
char |
float return TYPE;
{identifier} {strcpy(yylval.var,yytext);
return VAR;}
{number} {strcpy(yylval.var,yytext);
return NUM;}
\< |
\> |
\>= |
\<= |
=={strcpy(yylval.var,yytext);
return RELOP;}
[\t];
\n LineNo++;
.return yytext[0];
%%
<int.y>
%{
#include<string.h>
#include<stdio.h>
struct quad
{
char op[5];
char arg1[10];
char arg2[10];
char result[10];
}QUAD[30];
struct stack
{
int items[100];
int top;
}stk;
int Index=0,tIndex=0,StNo,Ind,tInd;
extern int LineNo;
Compiler Design Lab Page 12
TRINITY COLLEGE OF ENGG & TECHNOLOGY
%}
%union
{
char var[10];
}
%token <var> NUM VAR RELOP
%token MAIN ID ELSE WHILE TYPE
%type <var> EXPR ASSIGNMENT CONDITION IFST ELSEST WHILELOOP
%left '-' '+'
%left '*' '/'
%%
PROGRAM:MAIN bloCK
;
BLOCK:'{'CODE'}'
;
CODE BLOCK
|STATEMENT CODE
|STATEMENT
;
STATEMENT:DESCT';'
|ASSIGNMENT';'
|CONDST
|WHILEST
;
DESCT:TYPE VARLIST
|VAR
;
ASSIGNMENT:VAR'='EXPR{
strcpy(QUAD[Index].op,"=");
strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,$1);
strcpy($$,QUAD[Index++].result);
}
;
EXPR:EXPR'+'EXPR{AddQuadruple("+",$1,$3,$$);}
|EXPR'-'EXPR{AddQuadruple("-",$1,$3,$$);}
|EXPR'*'EXPR{AddQuadruple("*",$1,$3,$$);}
|EXPR'/'EXPR{AddQuadruple("/",$1,$3,$$);}
|'-'EXPR{AddQuadruple("UMIN",$2,"",$$);}
|'('EXPR')'{strcpy($$,$2);}
|VAR
|NUM
;
CONDST:IFST{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}
Compiler Design Lab Page 13
TRINITY COLLEGE OF ENGG & TECHNOLOGY
|IFST ELSEST
;
IFST:IF'('CONDITION')'{
strcpy(QUAD[Index].op,"==");
strcpy(QUAD[Index.arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
}
BLOCK{
strcpy(QUAD[Index].op,"GOTO");
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
};
ELSEST:ELSE{
tInd=pop();
Ind=pop();
push(tInd);
sprintf(QUAD[Ind].result,"%d",Index);
}
BLOCK{
Ind=pop();
sprintf(QUAD[Ind].reslult,"%d",Index);
};
CONDITION:VAR RELOP VAR{AddQuadruple($2,$1,$3,$$);
StNo=Index-1;
}
| VAR
| NUM
;
WHILEST:WHILELOOP{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",StNo);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}
;
WHILELOOP:WHILE'('CONDITION')'{
strcpy(QUAD[Index].op"==");
strcpy(QUAD[Index.arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
BLOCK{
strcpy(QUAD[Index].op,"GOTO");
Compiler Design Lab Page 14
TRINITY COLLEGE OF ENGG & TECHNOLOGY
strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
;
%%
extern FILE *yyin;
int main(int argc,char *argv[])
{
FILE *fp;
int i;
if(argc>1)
{
fp=fopen(argv[1],"r");
if(!fp)
{
printf("File not found");
exit(0);
}
yyin=fp;
}
yyparse();
printf("\n\n\t\t---------------------------------""\n\t\tPos Operator Arg1 Arg2
Result""\n\t\t----------------");
for(i=0;i<Index;i++)
{
printf("\n\t\t%d\t%s\t%s\t%s\t
%s",i,QUAD[i].op,QUAD[i].arg1,QUAD[i].arg2,QUAD[i].result);
}
printf("\n\t\t---------------------------");
printf("\n\n");
return 0;
}
void push(int data)
{
stk.top++;
if(stk.top==100)
{
printf("\nStack overflow\n);
exit(0);
}
stk.items[stk.top]=data;
}
int pop()
{
int data;
if(stk.top==-1)
Compiler Design Lab Page 15
TRINITY COLLEGE OF ENGG & TECHNOLOGY
{
printf("\nStack underflow\n");
exit(0);
}
data=stk.items[stk.top--];
return data;
}
void AddQuadruple(char op[5],char arg1[10],char arg2[10],char result[10])
{
strcpy(QUAD[Index].op,op);
strcpy(QUAD[Index].arg1,arg1);
strcpy(QUAD[Index].arg2,arg2);
sprintf(QUAD[Index].result,"t%d",tIndex++);
strcpy(result,QUAD[Index++].result);
}
yyerror()
{
printf("\nError on line no.%d",LineNo);
}
Input:
Svi test.c
main()
{
int a,b,c;
if(a<b)
{
a=a+b;
}
while(a<b)
{
a=a+b;
}
if(a<=b)
{
c=a-b;
}
else
{
c=a+b;
}
}
Output:
Slex int.l
Syacc -d int.y
Sgcc lex.yy.c y.tab.c -ll -lm
S./a.out test.c
switch(op[0])
{
case '*':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD",operand1);
fprintf(fp2,"\n\tLOAD %s,R1",operand2);
fprintf(fp2,"\n\tMUL R1,R0");
fprintf(fp2,"\n\tSTORE R0,%s",result);
break;
case '+':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
fprintf(fp2,"\n\tLOAD %s,R1",operand2);
fprintf(fp2,"\n\tADD R1,R0");
fprintf(fp2,"\n\tSTORE R0,%s",result);
break;
case '-':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
fprintf(fp2,"\n\tLOAD %s,R1",operand2);
fprintf(fp2,"\n\tSUB R1,R0");
fprintf(fp2,"\n\tSTORE R0,%s",result);
break;
case '/':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
fprintf(fp2,"\n\tLOAD %s,R1",operand2);
fprintf(fp2,"\n\tDIV R1,R0");
fprintf(fp2,"\n\tSTORE R0,%s",result);
break;
case '%':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
fprintf(fp2,"\n\tLOAD %s,R1",operand2);
fprintf(fp2,"\n\tDIV R1,R0,%s",result);
break;
case '=':fscanf(fp1,"%s %s",operand1,result);
fprintf(fp2,"\n\tSTORE %s %s",operand1,result);
break;
case '>':j++;
fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
frprintf(fp2,"\n\tJGT %s,label#%s",operand2,result);
label[no++]=atoi(result);
break;
case '<':fscanf(fp1,"%s %s %s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD %s,R0",operand1);
fprintf(fp2,"\n\tJLT %s,label#%d",operand2,result);
label[no++]=atoi(result);
break;
}
}
fclose(fp2);
fclose(fp1);
fp2=fopen("target.txt","r");
Compiler Design Lab Page 19
TRINITY COLLEGE OF ENGG & TECHNOLOGY
if(fp2==NULL)
{
printf("Error opening the file\n");
exit(0);
}
do
{
ch=fgetc(fp2);
printf("%c",ch);
}while(ch!=EOF);
fclose(fp1);
return(0);
}int check_label(int k)
{
int i;
for(i=0;i<no;i++)
{
if(k==label[i])
return 1;
}
return 0;
}
Input:
Svi int.txt
=t1 2
[]=a 0 1
[]=a 1 2
[]=a 2 3
*t1 6 t2
+a[2] t2 t3
-a[2] t2 t3
/t3 t2 2
uminus t2 2
print t2
goto t2 t3
=t3 99
uminus 25 t2
*t2 t3 t3
uminus t1 t1
+t1 t3 t4
print t4
Output:
Enter filename of the intermediate code:int.txt
STORE t1,2
STORE a[0],1
STORE a[1],2
STORE a[2],3
LOAD t1,R0
LOAD 6,R1
ADD R1,R0
STORE R0,t3
LOAD a[2],R0
LOAD t2,R1
ADD R1,R0
STORE R0,t3
LOAD a[t2],R0
LOAD t1,R1
SUB R1,R0
STORE R0,t2
LOAD t3,R0
LOAD t2,R1
DIV R1,R0
STORE R0,t2
LOAD t2,R1
STORE R1,t2
LOAD t2,R0
JGT 5,label#11
label#11:OUT t2
JMP t2,label#13
label#13:STORE t3,99
LOAD 25,R1
STORE R1,t2
LOAD t2,R0
LOAD t3,R1
MUL R1,R0
STORE R0,t3
LOAD t1,R1
STORE R1,t1
LOAD t1,R0
LOAD t3,R1
ADD R1,R0
STORE R0,t4
OUT t4