CD Lab Manual
CD Lab Manual
In-charge
HOD
Principal
Prepared by:
Issued by:
w.e.f Date:
Lab Manual for the Academic Year 2011-12 (In accordance with JNTU syllabus)
SUBJECT STREAM
: :
H.O.D
S.
TOPIC
Page
2
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
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
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.
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
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); }
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
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
"/*" {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
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
12
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
{ 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
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
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");
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
{ 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
19
{ 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
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
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
%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
} ; 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
}; 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
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
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
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:
29
30