Aryan CD Lab Manual PDF
Aryan CD Lab Manual PDF
Aryan CD Lab Manual PDF
SULTANPUR
Bachelor of Technology
In
Computer Science and Engineering
1
EXPERIMENT - 1
OBJECTIVE: Design a lexical analyzer for given language and the lexical analyzer
should ignore redundant spaces, tabs, and new lines.
#include<string.h>
#include<conio.h>
#include<ctype.h>
#include<stdio.h>
void main() {
FILE *f1; char
c,str[10];
int lineno=1,num=0,i=0; clrscr();
printf("\nEnter the c program\n"); f1=fopen("input.txt","w");
while((c=getchar())!=EOF)
putc(c,f1); fclose(f1);
f1=fopen("input.txt","r")
;
while((c=getc(f1))!=EOF) // TO READ THE GIVEN FILE
{
if(isdigit(c)) // TO RECOGNIZE NUMBERS
{
c=getc(f1); num=c-48; while(isdigit(c))
{
num=num*10+(c-48);
c=getc(f1);
}
printf("%d is a number \n",num);
ungetc(c,f1);
}
else if(isalpha(c)) // TO RECOGNIZE KEYWORDS AND IDENTIFIERS
{
str[i++]=c;
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
str[i++]=c;
c=getc(f1);
}
str[i++]='\0'; 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) // TYPE 32 KEYWORDS printf("%s is a
keyword\n",str);
else
printf("%s is a identifier\n",str); ungetc(c,f1);
i=0;
}
else if(c==' '||c=='\t') // TO IGNORE THE SPACE printf("\n");
else if(c=='\n') // TO COUNT LINE NUMBER
lineno++; else // TO FIND SPECIAL SYMBOL
printf("%c is a special symbol\n",c);
2
}
printf("Total no. of lines are: %d\n",lineno);
fclose(f1); getch();
}
OUTPUT
3
EXPERIMENT - 2
OBJECTIVE: Write a program to find epsilon closure of all states of any given NFA
with epsilon transition.
#include<stdio.h>
#include<string.h>
char result[20][20],copy[3],states[20][20];
int main(){
FILE *INPUT;
INPUT=fopen("input.dat","r");
char state[3];
int end,i=0,n,k=0;
char state1[3],input[3],state2[3];
printf("n Enter the no of states: ");
scanf("%d",&n);
printf("n Enter the states n");
for(k=0;k<3;k++){
scanf("%s",states[k]);
}
for( k=0;k<n;k++){
i=0;
strcpy(state,states[k]);
strcpy(copy,state);
add_state(state,i++);
while(1){
end = fscanf(INPUT,"%s%s%s",state1,input,state2);
if (end == EOF ){
break;
}
if( strcmp(state,state1) = = 0 ){
if( strcmp(input,"e") == 0 ) {
add_state(state2,i++);
strcpy(state, state2);
}
}
}
display(i);
rewind(INPUT);
}
4
return 0;
}
Output
input.dat
q0 0 q0
q0 1 q1
q0 e q1
q1 1 q2
q1 e q2
Epsilon closure of q0 = { q0 q1 q2 }
Epsilon closure of q1 = { q1 q2 }
Epsilon closure of q2 = { q2 }
5
EXPERIMENT - 3
#include<stdio.h>
#include<conio.h>
void main() {
char stack[20],ip[20],opt[10][10][1],ter[10];
inti,j,k,n,top=0,row,col; clrscr();
for(i=0;i<10;i++)
{
stack[i]=NULL;
ip[i]=NULL;
for(j=0;j<10;j++)
{
opt[i][j][1]=NULL;
}
}
printf("Enter the no.of terminals:"); scanf("%d",&n);
printf("\nEnter the terminals:");
scanf("%s",ter);
printf("\nEnter the table values:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("Enter the value for %c %c:",ter[i],ter[j]);
scanf("%s",opt[i][j]);
}
}
printf("\nOPERATOR PRECEDENCE TABLE:\n"); for(i=0;i<n;i++)
{
printf("\t%c",ter[i]);
}
printf("\n_________________________________________"); printf("\n");
for(i=0;i<n;i++)
{
printf("\n%c |",ter[i]);
for(j=0;j<n;j++)
{
printf("\t%c",opt[i][j][0]);
}
}
stack[top]='$';
printf("\n\nEnter the input string(append with $):"); scanf("%s",ip);
i=0;
printf("\nSTACK\t\t\tINPUT STRING\t\t\tACTION\n");
printf("\n%s\t\t\t%s\t\t\t",stack,ip); while(i<=strlen(ip))
{
for(k=0;k<n;k++)
{
if(stack[top]==ter[k])
row=k;
6
if(ip[i]==ter[k])
col=k;
}
if((stack[top]=='$')&&(ip[i]=='$'))
{
printf("String is ACCEPTED");
break;
}
else if((opt[row][col][0]=='<') ||(opt[row][col][0]=='='))
{
stack[++top]=opt[row][col][0];
stack[++top]=ip[i];
ip[i]=' ';
printf("Shift %c",ip[i]);
i++;
}
else
{
if(opt[row][col][0]=='>')
{
while(stack[top]!='<')
{
--top;
}
top=top-1;
printf("Reduce")
} ;
else
{
printf("\nString is not accepted");
break;
}
}
printf("\n");
printf("%s\t\t\t%s\t\t\t",stack,ip);
}
getch();
}
OUTPUT
$ i+i*i$ Shift
$<i +i*i$ Reduce
$<i +i*i$ Shift
$<+ i*i$ Shift
$<+<i *i$ Reduce
$<+<i *i$ Shift
$<+<* i$ Shift
$<+<*<i $ Reduce
$<+<*<i $ Reduce
$<+<*<i $ Reduce
$<+<*<i $ String is ACCEPTED
8
EXPERIMENT - 4
#include<stdio.h>
#include<string.h>
void main()
{
clrscr();
printf("Enter an arithmetic expression :\n"); gets(input);
E();
if(strlen(input)==i&&error==0)
printf("\nAccepted..!!!");
else
printf("\nRejected..!!!"); getch();
} void E()
{
T();
Eprime(); }
voidEprime() {
if(input[i]=='+'
)
{ i++;
T();
Eprime()
;
}}
void T()
{
F();
Tprime(); }
voidTprime() {
if(input[i]=='*')
{
i++;
F();
Tprime();
}}
void F()
{
i++; if(input[i]=='(')
i++;
E();
if(input[i]==')')
}
else if(isalpha(input[i]))
9
{
i++;
while(isalnum(input[i])||input[i]=='_')
i++;
}
else
error=1;
}
OUTPUT
1)
Enter an arithmetic expression :
sum+month*interest
Accepted..!!!
2)
Enter an arithmetic expression :
sum+avg*+interest
Rejected..!!!
10
EXPERIMENT - 5
11
else break;
if(str[i]=='+')
c=0;
else if(str[i]=='*') c=1;
else if(str[i]=='i') c=2;
else if(str[i]=='(') c=3;
else if(str[i]==')') c=4;
else if(str[i]=='$') c=5;
else break;
if(strcmp(t[r][c],"$")==0) break;
ch=pop(); temp=t[r][c];
m=strlen(temp);
if(strcmp(t[r][c],"e")!=0)
{
for(k=m-1;k>=0;k--) push(temp[k]);
}
}
printf("\n");
} if(i==n) printf("\nparsed
successfully");
else printf("\nnot parsed");
}
OUTPUT
1)
Enter any String(Append with $)i+i*i$
Stack Input $E i+i*i$ Output
$E i+i**i$
$HT i+i**i$ E->TH
$HUF i+i**i$ T->FU
$HUii+i**i$ F->i
12
$HU +i**i$ POP $H
+i**i$ U->ε
$HT+ +i**i$ H->+TH
$HT i**i$ POP
$HUF i**i$ T->FU
$HUi i**i$ F->i $HU
**i$ POP
$HUF* **i$ U->*FU
$HUF *i$ POP $HU$
*i$ F->$
Syntax Error
Given String is not accepted
13
EXPERIMENT - 6
#include<stdio.h>
#include<string.h> # define SIZE 30
charst[100]; int top=-1; int
s1(char),ip(char); int n1,n2;
charnt[SIZE],t[SIZE]; /*Function to return
variable index*/
int s1(char c) {
int i;
for(i=0;i<n1;i++)
{ if(c==nt[i])
return i; }
}
/*Function to return terminal index*/
intip(char c) {
int i;
for(i=0;i<n2;i++)
{ if(c==t[i]) return i;
} } void push(char
c)
{ top++;
st[top]=c;
return; }
void pop() {
top--;
return; }
main() {
char table[SIZE][SIZE][10],input[SIZE];
intx,f,s,i,j,u;
printf("Enter the number of variables:");
scanf("%d",&n1);
printf("\nUse single capital letters for variables\n");
for(i=0;i<n1;i++)
{
printf("Enter the %d nonterminal:",i+1); scanf("%c",&nt[i]);
}
printf("Enter the number of terminals:");
scanf("%d",&n2);
printf("\nUse single small letters for terminals\n"); for(i=0;i<n2;i++)
{
printf("Enter the %d terminal:",i+1); scanf("%c",&t[i]);
}
/*Reading the parsing table*/
printf("Please enter only right sides of productions\n"); printf("Use symbol n to
denote no entry and e to epsilon\n"); for(i=0;i<n1;i++)
{
for(j=0;j<n2;j++)
{
printf("\nEnter the entry for %c under %c:",nt[i],t[j]); scanf("%s",table[i][j]);
}
}
14
/*Printing the parsing taable*/
for(i=0;i<n2;i++)
printf("\t%c",t[i]);
printf("\n---------------------------------------------------------\n");
for(i=0;i<n1;i++)
{
printf("\n%c|\t",nt[i]); for(j=0;j<n2;j++)
{
if(!strcmp(table[i][j],"n"))
printf("\t"); else
printf("%s\t",Table[i][j]);
} printf("\n"); }
printf("Enter the input:");
scanf("%s",input); /*Initialising the
stack*/
top++; st[top]='$';
top++;
st[top]=nt[0];
printf("STACK content INPUT content PRODUCTION used\n");
printf("--------------------------------------------------------------\ n"); i=0;
printf("$%c\t\t\t%s\n\n",st[top],input); while(st[top]!='$')
{ x=0; f=s1(st[top]);
s=ip(input[i]);
if(!strcmp(table[f][s],"n"))
{
printf("'String not accepted");
} else
if(!strcmp(table[f][s],"e"))
{ pop(); } else
if(st[top]==input[i]) {
x=1; pop(); i++; } else
{ pop();
for(j=strlen(table[f][s])-1;j>0;j--)
{ { push(table[f][s][j]);
}
} for(u=0;u<=top;u++)
printf("%c",st[u]);
printf("\t\t\t");
for(u=i;input[u]!='\0';u++)
printf("%c",input[u]);
printf("\t\t\t"); if(x==0) printf("%c-
>%s\n\n",nt[f],table[f][s]);
printf("'\n\n"); }
printf("\n\nThus string is accepted");
}
}
OUTPUT:
Enter the number of variables:5
Use single capital letters for the variables
15
Enter the 1 non terminal:E
Enter the 2 non terminal:A
Enter the 3 non terminal:T
Enter the 4 non terminal:B
Enter the 5 non terminal:F
Enter the number of terminals:6
Use only single small letter for the terminals
Enter the 1 terminal:+
Enter the 2 terminal:*
Enter the 3 terminal:(
Enter the 4 terminal:)
Enter the 5 terminal:i
Enter the 6 terminal:$
Please enter only the right sides of productions.
Use symbol n to denote noentry and e to epsilon
Enter the entry for E under $: n
Enter the entry for E under +: n
Enter the entry for E under *: n
Enter the entry for E under (: TA
Enter the entry for E under ): n
Enter the entry for E under i: TA
Enter the entry for A under +: +TA
Enter the entry for A under *: n
Enter the entry for A under (: n
Enter the entry for A under ): e
Enter the entry for A under i: n
Enter the entry for A under $: e
Enter the entry for T under +: n
Enter the entry for T under *: n
Enter the entry for T under (: FB
Enter the entry for T under ): n
Enter the entry for T under i: FB Enter the
entry for T under $: n
Enter the entry for B under +: e
Enter the entry for B under *: *FB
Enter the entry for B under (: n
Enter the entry for B under ): e
Enter the entry for B under i: n
Enter the entry for B under $: e
Enter the entry for F under +: n
Enter the entry for F under *: n
Enter the entry for F under (: (E)
Enter the entry for F under ): n
Enter the entry for F under i: i
Enter the entry for F under $: n
+*()i$
----------------------------------------------------------------------------- E| TA TA
A| +TA e e
T| FB FB
B| e *FB e e
F| (E) i
Enter the input: i+i*i$
Stack content Input content Production used
----------------------------------------------------------------------------------- $E i+i*i$
$A i+i*i$ E->TA
16
$AB i+i*i$ T->FB
$AB i+i*i$ F->i
$A +i*i$
$ +i*i$ B->e
$AT +i*i$ A->+TA
$A i*i$
$AB i*i$ T->FB
$AB i*i$ F->i
$A *i$
$ABF *i$ B->*FB
$AB i$
$AB i$ F->i
$A $
$ $ B->e
$ A->e
Thus string is accepted
17
EXPERIMENT - 7
#include"stdio.h"
#include"stdlib.h"
#include"string.h" char
ip_sym[15],stack[15]; int
ip_ptr=0,st_ptr=0,len,i; char
temp[2],temp2[2]; char act[15];
void check(); void main()
{
printf("\n\t\t SHIFT REDUCE PARSER\n");
printf("\n GRAMMER\n"); printf("\n E->E+E\n
E-
>E/E"); printf("\n E->E*E\n E->a/b"); printf("\n enter
the input symbol:\t"); gets(ip_sym);
printf("\n\t
input stack implementation
symbol\t\t action");table");printf("\n______\t\t
printf("\n stack\t\t
____________\t\t ______\n");
printf("\n $\t\t%s$\t\t\t--",ip_sym);
strcpy(act,"shift ");
temp[0]=ip_sym[ip_ptr]; temp[1]='\0';
strcat(act,temp); len=strlen(ip_sym);
for(i=0;i<=len-1;i++)
{ stack[st_ptr]=ip_sym[ip_ptr]; stack[st_ptr+1]='\0';
ip_sym[ip_ptr]=' '; ip_ptr++; printf("\n
$%s\t\t%s$\t\t\t%s",stack,ip_sym,act);
strcpy(act,"shift ");
temp[0]=ip_sym[ip_ptr];
temp[1]='\0'; strcat(act,temp);
check(); st_ptr++; } check(); }
void check() { int flag=0;
temp2[0]=stack[st_ptr];
temp2[1]='\0';
if((isalpha(temp2[0])))
{
stack[st_ptr]='E';
printf("\n $%s\t\t%s$\t\t\tE->%s",stack,ip_sym,temp2); flag=1; }
if((!strcmp(temp2,"+"))||(!strcmp(temp2,"*"))||(!strcmp(temp2,"/")))
{ flag=1;
}
if((!strcmp(stack,"E+E"))||(!strcmp(stack,"E/E"))||(!strcmp(stack,"E*E")))
{
if(!strcmp(stack,"E+E"))
{ strcpy(stack,"E");
printf("\n $%s\t\t%s$\t\t\tE->E+E",stack,ip_sym);
}
else if(!strcmp(stack,"E/E"))
{ strcpy(stack,"E");
printf("\n $%s\t\t %s$\t\t\tE->E/E",stack,ip_sym);
} else {
strcpy(stack,"E")
;
printf("\n $%s\t\t%s$\t\t\tE->E*E",stack,ip_sym);
} flag=1;
st_ptr=0;
}
18
{
printf("\n $%s\t\t%s$\t\t\tACCEPT",stack,ip_sym); exit(0); }
if(flag==0) { printf("\n
$%s\t\t%s$\t\t\tReject",stack,ip_sym); exit(0); } return;
}
OUTPUT:
1)
SHIFT REDUCE PARSER GRAMMER
E->E+E
E->E/E E-
>E*E E->E-E
E->id
enter the input symbol: a+b*c stack
implementation table
stack input symbol action ______
____________ ______
$ a+b*c$ -- $a
+b*c$ shift a
$E +b*c$ E->a
$E+ b*c$ shift +
$E+b *c$ shift b
$E+E *c$ E->b
$E *c$ E->E+E
$E* c$ shift *
$E*c $ shift c
$E*E $ E->c
$E $ E->E*E
$E $ ACCEPT
$ a+b*+c$ -- $a
+b*+c$ shift a
$E +b*+c$ E->a
$E+ b*+c$ shift +
$E+b *+c$ shift b $E+E
*+c$ E->b
$E *+c$ E->E+E $E*
+c$ shift *
$E*+ c$ shift +
$E*+c $ shift c
$E*+E $ E->c
$E*+E reject
19
EXPERIMENT - 8
yylex() { char
c[10],i;
gets(c);
if(isdigit(c)) {
yylval=c;
return ID; }
return c;
}
Output:
$vi lalr.y
$yacc –v lalr.y
$vi y.output
y.output contains the ouput
20
'(' shift 2
. error
exprgoto 7 term goto 5 factor goto
6 state 3 $accept : line . $end
(0) $end accept state 4 line
:expr . '\n' (1)
expr :expr . '+' term (2)
'\n' shift 8
'+' shift 9 . error state
5 expr : term . (3) term : term .
'*' factor (4)
'*' shift 10
'\n' reduce 3
'+' reduce 3 ')'
reduce 3 state 6 term : factor
. (5) . reduce 5 state 7
expr :expr . '+' term (2)
factor : '(' expr . ')' (6) '+'
shift 9
')' shift 11 . error
state 8 line :expr '\n' . (1)
. reduce 1 state 9 expr :expr
'+' . term (2) ID shift 1
'(' shift 2
. error
term goto 12 factor goto 6
state 10 term : term '*' . factor
(4) ID shift 1
'(' shift 2
. error
factor goto 13 state 11 factor :
'(' expr ')' . (6) . reduce 6
state 12 expr :expr '+' term . (2)
term : term . '*' factor (4)
'*' shift 10
'\n' reduce 2
'+' reduce 2 ')' reduce
2 state 13 term : term '*' factor
. (4) . reduce 4
8 terminals, 5 nonterminals
8 grammar rules, 14 states
21
EXPERIMENT - 9
OBJECTIVE: Implement the lexical analyzer using JLex, flex or lex or other lexical
analyzer generating tools
delim [\t] ws
{delim}+ letter
[A-Za-z] digit [0-
9]
id {letter}({letter}|{digit})* num
{digit}+(\.{digit}+)?(E[+|-]?{digit}+)
?
%%
ws {printf("no action");}
if|else|then {printf("%s is a keyword",yytext);} // TYPE 32 KEYWORDS
{id} {printf("%s is a identifier",yytext);}
{num} {printf(" it is a number");}
"<" {printf("it is a relational operator less than");}
"<=" {printf("it is a relational operator less than or equal");}
">" {printf("it is a relational operator greater than");}
">=" {printf("it is a relational operator greater than");}
"==" {printf("it is a relational operator equal");}
"<>" {printf("it is a relational operator not equal");}
%%
main() {
yylex();
}
OUTPUT
lexlexicalfile.l cc
lex.yy.c -ll if
if is a keyword
number
number is a identifier
254
It is a number <>
it is a relational operator not equal
^Z
22
EXPERIMENT - 10
#include<stdio.h>
int main() {
int i;
for(i=0;i<10;i+=2)
{
printf("fun(%d)\n",i+1);
printf("fun(%d)\n",i+2);
}
}
OUTPUT
fun(1) fun(2)
fun(3) fun(4)
fun(5) fun(6)
fun(7) fun(8)
fun(9)
fun(10)
23