Compiler-Design-Lab-Manual

April 20, 2017 | Author: Abhiram Gantyada | Category: N/A
Share Embed Donate


Short Description

Download Compiler-Design-Lab-Manual...

Description

www.jntuworld.com CD LAB PROGRAMS

DEPARTMENT OF COMPUTER SCIENCE AND ENGINEERING

D L

R O

Compiler Design Lab Manual

W U

T N

J

Prepared by

Mohan Rao Mamdikar ASST-PROF,CSE

LORDS INSTITUTE OF ENGINEERING AND TECHNOLOGY (Affiliated to JNTU, Hyd. & Approved by AICTE)

Himayat Sagar, Hyderabad

1

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

TABLE OF CONTENTS (As per syllabus) S.N o 1 2 3

Wee k

TOPIC

Page No.

System Requirements

3

Lab Objectives

4

Design a lexical analyzer for given language .the lexical analyzer should ignore redundant spaces, tabs and new lines. Implement the lexical analyzer using JLex, flex or other lexical analyzer generating tools.

5 8

4 5

Design predictive parser for the given language

D L

Design a LALR bottom up parser for the given language 6 7

R O

Convert the BNF rules into Yacc form and write code to generate abstract syntax tree. A program to generate machine code

8

W U

9

T N

10 11 12 13

J

14 15 16 17 18

2

www.jntuworld.com

11 16 18 25

www.jntuworld.com CD LAB PROGRAMS

System Requirements 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.

D L

R O

W U

T N

J

3

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

Lab Objectives 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.

D L

R O

W U

T N

J

4

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

1)A Program to Design Lexical Analyzer. #include #include #include 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'; 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);

D L

R O

W U

T N

J

5

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

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); printf("\nThe no's in the program are"); for(j=0;j {if(!COMMENT) printf("\n\t%s is a RELATIONAL OPERATOR",yytext);}

D L

%%

R O

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"); return 0; } int yywrap() { return 0; }

W U

T N

J

9

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

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

Output: $lex lex.l $cc lex.yy.c $./a.out var.c

R O

D L

#include is a PREPROCESSOR DIRECTIVE FUNCTION

W U

main ( )

T N

BLOCK BEGINS

int is a KEYWORD

J

a IDENTIFIER b IDENTIFIER BLOCK ENDS

10

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

3) Implementation of Predictive Parser. #include #include #include #include #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 keywords[]={"if",KEYWORD,"else",KEYWORD,"for",KEYWORD,"int",KEYWORD, "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;

D L

R O

W U

T N

J

11

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

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() { 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"); } buffer[i]=EOS; if(t!=EOF)

D L

R O

W U

T N

J

12

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

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); 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;

R O

D L

W U

T N

J

13

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

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; 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;

D L

R O

W U

T N

J

14

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

} } } void parser() { lookahead=lexer(); while(lookahead!=DONE) { 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:

R O

D L

W U

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

T N

J

15

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

4) Design LALR Bottom up Parser . %{ #include #include "y.tab.h" %} %% [0-9]+ {yylval.dval=atof(yytext); return DIGIT; } \n|. return yytext[0]; %%

D L

%{

R O

/*This YACC specification file generates the LALR parser for the program considered in experiment 4.*/ #include %} %union { double dval; }

W U

T N

%token DIGIT %type expr %type term %type factor

J

%% line: expr '\n'

{ printf("%g\n",$1); }

; expr: expr '+' term | term ; term: term '*' factor | factor ; factor: '(' expr ')'

{$$=$1 + $3 ;} {$$=$1 * $3 ;} {$$=$2 ;} 16

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

| DIGIT ; %% int main() { yyparse(); } yyerror(char *s) { printf("%s",s); }

Output:

D L

$lex parser.l $yacc –d parser.y $cc lex.yy.c y.tab.c –ll –lm $./a.out 2+3 5.0000

R O

W U

T N

J

17

www.jntuworld.com

www.jntuworld.com CD LAB PROGRAMS

5) Convert The BNF rules into Yacc form and write code to generate abstract syntax tree. %{ #include"y.tab.h" #include #include int LineNo=1; %} identifier [a-zA-Z][_a-zA-Z0-9]* number [0-9]+|([0-9]*\.[0-9]+) %%

D L

main\(\) return MAIN; if else while

return IF; return ELSE; return WHILE;

int | char | float

return TYPE;

R O

W U

{identifier} {strcpy(yylval.var,yytext); return VAR;} {number} \< | \> | \>= | \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
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF