Compiler Design Lab
Compiler Design Lab
LAB MANUAL
INDEX
OBJECTIVE: Design a lexical analyzer for given language and the lexical analyzer should
ignore redundant spaces, tabs and new lines. It should also ignore comments. Although the
syntax specification states that identifiers can be arbitrarily long, you may restrict the length
to some reasonable value. Simulate the same in C language
RESOURCE: Turbo C ++
PROGRAM LOGIC:
1. Read the input Expression
2. Check whether input is alphabet or digits then store it as identifier
3. If the input is is operator store it as symbol
4. Check the input for keywords 1.4 PROCEDURE: Go to debug -> run or press CTRL + F9
to run the program
Program:
#include<stdio.h>
#include<conio.h>
#include<string.h>
char prol[7][10]={"S","A","A","B","B","C","C"}
char pror[7][10]={"A","Bb","Cd","aB","@","Cc","@"}
char prod[7][10]={"S->A","A->Bb","A->Cd","B->aB","B->@","C->Cc","C->@"}
char first[7][10]={"abcd","ab","cd","a@","@","c@","@"}
char follow[7][10]={"$","$","$","a$","b$","c$","d$"}
char table[5][6][10]
numr(char c) { switch(c) { case 'S': return 0
case 'A': return 1
case 'B': return 2
case 'C': return 3
case 'a': return 0
case 'b': return 1
case 'c': return 2
case 'd': return 3
case '$': return 4
}
return(2)
} void main() { int i,j,k
clrscr()
for(i=0
i<5
i++) for(j=0
j<6
j++) strcpy(table[i][j]," ")
printf("\nThe following is the predictive parsing table for the following grammar:\n")
for(i=0
i<7
i++) printf("%s\n",prod[i])
printf("\nPredictive parsing table is\n")
fflush(stdin)
for(i=0
i<7
i++) { k=strlen(first[i])
for(j=0
j<10
j++) if(first[i][j]!='@') strcpy(table[numr(prol[i][0])+1][numr(first[i][j])+1],prod[i])
} for(i=0
i<7
i++) { if(strlen(pror[i])==1) { if(pror[i][0]=='@') { k=strlen(follow[i])
for(j=0
j<k
j++)
strcpy(table[numr(prol[i][0])+1][numr(follow[i][j])+1],prod[i])
} } } strcpy(table[0][0]," ")
strcpy(table[0][1],"a")
strcpy(table[0][2],"b")
strcpy(table[0][3],"c")
strcpy(table[0][4],"d")
strcpy(table[0][5],"$")
strcpy(table[1][0],"S")
strcpy(table[2][0],"A")
strcpy(table[3][0],"B")
strcpy(table[4][0],"C")
printf("\n--------------------------------------------------------\n")
for(i=0
i<5
i++) for(j=0
j<6
j++) { printf("%-10s",table[i][j])
if(j==5) printf("\n--------------------------------------------------------\n")
} getch()
}
LAB ASSIGNMENT
1. Write a program to recognize identifiers.
2. Write a program to recognize constants.
3. Write a program to recognize keywords and identifiers.
4. Write a program to ignore the comments in the given input source program.
}
PRE LAB QUESTIONS
1. What is token?
2. What is lexeme?
3. What is the difference between token and lexeme?
4. Define phase and pass?
5. What is the difference between phase and pass?
6. What is the difference between compiler and interpreter?
LAB ASSIGNMENT
1. Write a program to recognize identifiers.
2. Write a program to recognize constants.
3. Write a program to recognize keywords and identifiers.
4. Write a program to ignore the comments in the given input source program.
OUTCOMES: Students will understand the lexical analyzer for a given using C.
DEV BHOOMI INSTITUTE OF TECHNOLOGY
LAB MANUAL
OUTCOMES: Students will implement and identify whether a given line is a comment or
not.
DEV BHOOMI INSTITUTE OF TECHNOLOGY
LAB MANUAL
PROGRAM:
#include<stdio.h>
#include<conio.h>
void main()
{
char s[5]
clrscr()
printf("\n Enter any operator:")
gets(s)
switch(s[0]) { case'>': if(s[1]=='=') printf("\n Greater than or equal")
else printf("\n Greater than")
break
case'<': if(s[1]=='=') printf("\n Less than or equal")
else printf("\nLess than")
break
case'=': if(s[1]=='=') printf("\nEqual to")
else printf("\nAssignment")
break
case'!': if(s[1]=='=') printf("\nNot Equal")
else printf("\n Bit Not")
break
case'&': if(s[1]=='&') printf("\nLogical AND")
else printf("\n Bitwise AND")
break
case'|': if(s[1]=='|') printf("\nLogical OR")
OBJECTIVE: Implement the lexical analyzer using JLex, flex or other lexical analyzer
generating tools.
RESOURCE: Linux using Putty
PROGRAM LOGIC: Read the input string. Check whether the string is identifier/ keyword
/symbol by using the rules of identifier and keywords using LEX Tool
PROCEDURE: Go to terminal .Open vi editor ,Lex lex.l , cc lex.yy.c , ./a.out
PROGRAM:
/* 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)
} "/*" {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")
return 0
} int yywrap() { return 0
}
PRE LAB QUESTIONS:
1. List the different sections available in LEX compiler?
2. What is an auxiliary definition?
3. How can we define the translation rules?
4. What is regular expression?
5. What is finite automaton?
LAB ASSIGNMENT:
1. Write a program that defines auxiliary definitions and translation rules of Pascal tokens?
2. Write a program that defines auxiliary definitions and translation rules of C tokens?
3. Write a program that defines auxiliary definitions and translation rules of JAVA tokens
OUTCOMES: Students will Implement the lexical analyzer using JLex, flex and generating
tools.