You are on page 1of 30

Department of Computer Science and Engineering

Department Of Computer Science & Engineering Compiler Design Lab Manual

BALAJI INSTITUTE OF TECHNOLOGY AND SCIENCE


Department of computer science & engineering

In-charge

HOD

Principal

Prepared by:

Approved & Reviewed by:

Issued by:

w.e.f Date:

Balaji Institute of Technology and Science

Department of Computer Science and Engineering

BALAJI INSTITUTE OF TECHNOLOGY AND SCIENCE


Laknepally(V), Narsampet, Warangal DEPARTMENT OF COMPUTER SCIENCE & ENGINEERING

Lab Manual for the Academic Year 2011-12 (In accordance with JNTU syllabus)

SUBJECT STREAM

: :

Compiler Design LAB CSE

H.O.D

S.

TOPIC

Page
2

Balaji Institute of Technology and Science

Department of Computer Science and Engineering

No
1 System Requirements

No.

Lab Objectives Design a lexical analyzer for given language and the lexical analyzer should ignore redundant spaces, tabs and new lines Implement the lexical analyzer using JLex, flex or other lexical analyzer generating tools. Design predictive parser for the given language Design a LALR bottom up parser for the given language Convert the BNF rules into YACC form and write code to generate abstract syntax tree. A program to generate machine code

System Requirements
Balaji Institute of Technology and Science 3

Department of Computer Science and Engineering

1. Intel based destktop PC of 166MHz or faster processor with at least 64 MB RAM and 100 MB free disk space. 2. C++ compiler and JDK kit.

Lab Objectives
Balaji Institute of Technology and Science 4

Department of Computer Science and Engineering

1. To

provide

an

Understanding

of

the

language

translation

peculiarities by designing complete translator for mini language. 2. To provide an understanding of the design aspect of operating system.

Balaji Institute of Technology and Science

Department of Computer Science and Engineering

Program No.1: Write a Program to Design Lexical Analyzer.


#include<string.h> #include<ctype.h> #include<stdio.h> void keyword(char str[10]) { if(strcmp("for",str)==0||strcmp("while",str)==0|| strcmp("do",str)==0||strcmp("int",str )==0||strcmp("float",str)==0|| strcmp("char",str)==0||strcmp("double",str)==0|| strcmp("static",str)==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) putc(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';
Balaji Institute of Technology and Science 6

Department of Computer Science and Engineering

c=getc(f1); while(isdigit(c)) { tokenvalue*=10+c-'0'; c=getc(f1); } num[i++]=tokenvalue; ungetc(c,f1); } else if(isalpha(c)) { putc(c,f2); c=getc(f1); while(isdigit(c)||isalpha(c)||c=='_'||c=='$') { putc(c,f2); c=getc(f1); } putc(' ',f2); ungetc(c,f1); } else if(c==' '||c=='\t') printf(" "); else if(c=='\n') lineno++; else putc(c,f3); } fclose(f2); fclose(f3); fclose(f1);
Balaji Institute of Technology and Science 7

Department of Computer Science and Engineering

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 identifiersare:"); 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); }

Balaji Institute of Technology and Science

Department of Computer Science and Engineering

Output:
Enter the C program a+b*c Ctrl-D The nos 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

Balaji Institute of Technology and Science

Department of Computer Science and Engineering

Program No. 2: Write a program Implement the Lexical Analyzer Using LEX Tool.
/* 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);}
Balaji Institute of Technology and Science 10

Department of Computer Science and Engineering

"/*" {COMMENT = 1;} /*{printf("\n\n\t%s is a COMMENT\n",yytext);}*/ "*/" {COMMENT = 0;} /* printf("\n\n\t%s is a COMMENT\n",yytext);}*/ {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");
Balaji Institute of Technology and Science 11

Department of Computer Science and Engineering

return 0; } int yywrap() { return 0; }

Input:
$vi var.c #include<stdio.h> main() { int a,b; }

Output:
$lex lex.l $cc lex.yy.c $./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

Balaji Institute of Technology and Science

12

Department of Computer Science and Engineering

Program No. 3: Write a Program for Implementation of Predictive Parser.


#include<stdio.h> #include<ctype.h> #include<string.h> #include<stdlib.h> #define SIZE 128 #define NONE -1 #define EOS '\0' #define NUM 257 #define KEYWORD 258 #define ID 259 #define DONE 260 #define MAX 999 char lexemes[MAX]; char buffer[SIZE]; int lastchar=-1; int lastentry=0; int tokenval=DONE; int lineno=1; int lookahead; struct entry { char *lexptr; int token; } symtable[100]; struct entry
Balaji Institute of Technology and Science 13

Department of Computer Science and Engineering

keywords[]={"if",KEYWORD,"else",KEYWORD,"for",KEYWORD,"int",KEYWO RD, "float",KEYWORD,"double",KEYWORD,"char",KEYWORD,"struct",KEYWORD, "ret urn",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("Symbpl table is full"); if(lastchar+len+1>=MAX) Error_Message("Lexemes array is full"); lastentry=lastentry+1; symtable[lastentry].token=tok; symtable[lastentry].lexptr=&lexemes[lastchar+1]; lastchar=lastchar+len+1; strcpy(symtable[lastentry].lexptr,s); return lastentry; } /*void Initialize()
Balaji Institute of Technology and Science 14

Department of Computer Science and Engineering

{ 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(isalpha(t)) { while(isalnum(t)) { buffer[i]=t; t=getchar(); i=i+1; if(i>=SIZE) Error_Message("Compiler error"); }
Balaji Institute of Technology and Science 15

Department of Computer Science and Engineering

buffer[i]=EOS; if(t!=EOF) ungetc(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 { 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("\n Number: %d",tval); else if(t==ID) printf("\n Identifier: %s",symtable[tval].lexptr);
Balaji Institute of Technology and Science 16

Department of Computer Science and Engineering

else printf("\n Token %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 : } } void T() { int t; F(); while(1) { switch(lookahead) { case '*' : t=lookahead; Match(lookahead); F(); display(t,NONE); continue;
Balaji Institute of Technology and Science 17

Error_Message("Syntax error");

Department of Computer Science and Engineering

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(lookahead!=DONE)
Balaji Institute of Technology and Science 18

Department of Computer Science and Engineering

{ E(); Match(';'); } } main() { char ans[10]; printf("\n Program for recursive decent parsing "); printf("\n Enter the expression "); printf("And place ; at the end\n"); printf("Press Ctrl-Z to terminate\n"); parser(); }

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

Balaji Institute of Technology and Science

19

Department of Computer Science and Engineering

Program No: 4 Write a program to Design LALR Bottom up Parser.


<parser.l> %{ #include<stdio.h> #include "y.tab.h" %} %% [0-9]+ {yylval.dval=atof(yytext); return DIGIT; } \n|. return yytext[0]; %% <parser.y> %{ /*This YACC specification file generates the LALR parser for the program considered in experiment 4.*/ #include<stdio.h> %} %union
Balaji Institute of Technology and Science 20

Department of Computer Science and Engineering

{ double dval; } %token <dval> DIGIT %type <dval> expr %type <dval> term %type <dval> factor %% line: expr '\n' { printf("%g\n",$1); } ; expr: expr '+' term {$$=$1 + $3 ;} | term ; term: term '*' factor {$$=$1 * $3 ;} | factor ; factor: '(' expr ')' {$$=$2 ;} | DIGIT ; %% int main() { yyparse(); } yyerror(char *s) { printf("%s",s); }

Output:
$lex parser.l $yacc d parser.y
Balaji Institute of Technology and Science 21

Department of Computer Science and Engineering

$cc lex.yy.c y.tab.c ll lm $./a.out 2+3 5.0000

Program No: 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 |
Balaji Institute of Technology and Science 22

Department of Computer Science and Engineering

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; %}
Balaji Institute of Technology and Science 23

Department of Computer Science and Engineering

%union { char var[10]; } %token <var> NUM VAR RELOP %token MAIN IF 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 ; VARLIST: VAR ',' 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);
Balaji Institute of Technology and Science 24

Department of Computer Science and Engineering

} ; 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); } | 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); Index++; } BLOCK { strcpy(QUAD[Index].op,"GOTO"); strcpy(QUAD[Index].arg1,""); strcpy(QUAD[Index].arg2,""); strcpy(QUAD[Index].result,"-1"); push(Index); Index++;
Balaji Institute of Technology and Science 25

Department of Computer Science and Engineering

}; ELSEST: ELSE{ tInd=pop(); Ind=pop(); push(tInd); sprintf(QUAD[Ind].result,"%d",Index); } BLOCK{ Ind=pop(); sprintf(QUAD[Ind].result,"%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");
Balaji Institute of Technology and Science 26

Department of Computer Science and Engineering

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("\n File not found"); exit(0); } yyin=fp; } yyparse(); printf("\n\n\t\t ----------------------------""\n\t\t Pos 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");
Balaji Institute of Technology and Science 27

Department of Computer Science and Engineering

return 0; } void push(int data) { stk.top++; if(stk.top==100) { printf("\n Stack overflow\n"); exit(0); } stk.items[stk.top]=data; } int pop() { int data; if(stk.top==-1) { printf("\n Stack 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() {
Balaji Institute of Technology and Science 28

Department of Computer Science and Engineering

printf("\n Error on line no:%d",LineNo); } Input: $vi 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: $lex int.l $yacc d int.y $gcc lex.yy.c y.tab.c ll lm $./a.out test.c OUTPUT:

Balaji Institute of Technology and Science

29

Department of Computer Science and Engineering

Balaji Institute of Technology and Science

30

You might also like