0% found this document useful (0 votes)
152 views37 pages

SS Lab

The YACC program defines the grammar rules for an arithmetic expression involving the operators +, -, *, and /. It specifies expression, term, and factor rules. The program will evaluate expressions entered by the user and print the result. Lexical analysis is done by a separate lex program that recognizes numbers and operators.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
152 views37 pages

SS Lab

The YACC program defines the grammar rules for an arithmetic expression involving the operators +, -, *, and /. It specifies expression, term, and factor rules. The program will evaluate expressions entered by the user and print the result. Lexical analysis is done by a separate lex program that recognizes numbers and operators.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 37

1b) Write YACC program to evaluate arithmetic expression involving operators: +, -, *, and /

%{
#include "lex.yy.c"
%}
%token NUM
%left '+' '-'
%left '*' '/'
%%
stmt: exp { printf("Value of expression = %d\n",$$); }
;
exp: exp '+' exp { $$=$1+$3; }
| exp '-' exp { $$=$1-$3; }
| exp '*' exp { $$=$1*$3; }
| exp '/' exp { if( $3==0 )
{ printf("Divide by zero error!\n");
yyerror();
}
else
$$=$1/$3;
}
| '(' exp ')' { $$=$2; }
| NUM { $$=$1; }
;
%%
main()
{
printf("Enter expression: ");
yyparse();
return;
}
int yyerror()
{
printf("Invalid expression\n");
exit(0);
}

%{ /*Lexpgm*/
#include "y.tab.h"
extern int yylval;
%}
%%
[0-9]+ { yylval=atoi(yytext); return NUM; }
[\+\-\*\/()] return( yytext[0] );
\n return(0);
. yyerror();
%%

[student@localhost ssn]$ lex pg1b.l


[student@localhost ssn]$ yacc -d pg1b.y
[student@localhost ssn]$ cc y.tab.c -ll
[student@localhost ssn]$ ./a.out
Enter expression: 5+(6*5)/(3+2)-8
Value of expression = 3
[student@localhost ssn]$ ./a.out
Enter expression: 6*4$3
Invalid expression
2) Develop, Implement and Execute a program using YACC tool to recognize all strings
ending with b preceded by n a’s using the grammar anb (note: input n value)

NOTE: (Write this program in Lab manual)

%{ /*YACC program*/
    #include "lex.yy.c"
    int n, acnt=0, bcnt=0;
%}
%token A B
%%
s : s1 s2 { if(acnt==n && bcnt==1)
             { printf("Valid string\n");
               exit(0);
             }
             else
             { printf("Invalid string\n");
               exit(0);
             }
           }
 ;
s1: A s1 { acnt++; }
 |
 ;
s2: B s2 { bcnt++; }
 |
 ;
%%

main(int argc, char **argv)


{
    n=atoi(argv[1]);
    printf("Enter the string);
    yyparse();
}
int yyerror()
{
    printf("Invalid\n");
    exit(0);
}

/*LEX program*/
%{
    #include "y.tab.h"
%}
%%
a    return A;
b    return B;
\n   return(0);
.    yyerror();
%%

[student@localhost ssn]$ vi pg2.l


[student@localhost ssn]$ vi pg2.y
[student@localhost ssn]$ yacc -d pg2.y
[student@localhost ssn]$ cc y.tab.c -ll
[student@localhost ssn]$ ./a.out 1
Enter the string: b
Invalid string
[student@localhost ssn]$ ./a.out 2
Enter the string: aab
Valid string

%{ /* Program to recognise the grammar (a^nb (Without Input n) */


    #include "lex.yy.c"
%}
%token A B
%%
s:B
  | A s1 B
 ;
s1: A s1
 |
 ;
%%

main()
{
    printf("Enter the string: ");
    yyparse();
    printf("Valid string\n");
}
int yyerror()
{
    printf("Invalid string\n");       exit(0);
}
%{ /*Lexpgm*/
    #include "y.tab.h"
%}
%%
a    return A;
b    return B;
\n   return(0);
.    yyerror();
%%

YACC program to recognize a valid arithmetic expression that uses operators +,-,* and /
%{
#include "lex.yy.c"
%}
%token ID NUM
%%
assign : ID '=' exp
;
exp : exp '+' term
| exp '-' term
| term
;
term : term '*' factor
| term '/' factor
| factor
;
factor : '(' exp ')'
| ID
| NUM
| '-' NUM
| '-' '(' exp ')'
;
%%
int yyerror()
{
printf("Invalid expression\n");
exit(0);
}
main()
{
printf("Enter an expression: ");
yyparse();
printf("Valid expression\n");
}

%{ /*Lexpgm*/
#include "y.tab.h"
%}
%%
[a-zA-Z]+ return ID;
[0-9]+ return NUM;
\n return(0);
. return(yytext[0]);
%%

[sunitha@localhost ~]$ ./a.out


Enter an expression: sum=a+b*67/6-count Valid expression
Enter an expression: a+b=c Invalid expression
Enter an expression: a>8 Invalid expression
/*3.Design, develop and implement YACC/C program to construct
Predictive / LL(1) Parsing Table for the grammar rules:
A->aBa , B->bB|e. Use this table to parse the sentence: abba$ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char ip[20],stack[20];
int main()
{
char m[2][3][3]={ {"aBa","E","E"},
{"n","bB","E"} };
int size[2][3]= {3,1,1,1,2,1};
int i,j,k,n,row,col,flag=0;
int p,q,r;
printf("\nEnter the input string: ");
scanf("%s",ip);
strcat(ip,"$");
n=strlen(ip);
stack[0]='$';
stack[1]='A';
i=1;
j=0;

printf("PARSING TABLE:\n");
for(p=0;p<2;p++)
{
for(q=0;q<3;q++)
{
for(r=0;r<3;r++)
printf("%c",m[p][q][r]);
printf("\t");
}
printf("\n");
}

printf("\nStack\t\tInput\n");
printf("________\t_________\n");

for(k=0;k<=i;k++)
printf("%c",stack[k]); /* Initial stack*/
printf("\t\t");
for(k=j;k<=n;k++)
printf("%c",ip[k]); /* input*/
printf("\n");

while((stack[i]!='$')&&(ip[j]!='$'))/*check stack and input


both contains $ */
{
if(stack[i]==ip[j]) /* input and stack matches,
discard stack and move to next input
symbol */
{

1
i--; //pop stack
j++; //advance the input pointer
for(k=0;k<=i;k++)
printf("%c",stack[k]); /*stack content */
printf("\t\t");
for(k=j;k<=n;k++)
printf("%c",ip[k]); /* input*/
printf("\n");
}
switch(stack[i])
{
case 'A': row=0;
break;
case 'B': row=1;
break;
default:if ((stack[i]=='$')&&(ip[j]=='$'))
printf("\nSUCCESSFULL PARSING\n");
else
{
printf("\nUNSUCCESSFULL PARSING\n");
printf("ERROR-NO VALID MATCH\n");
}
exit(0);
}
switch(ip[j])
{
case 'a': col=0;
break;
case 'b': col=1;
break;
case '$': col=2;
break;
}

if(m[row][col][0]==ip[j]) /*to check top of stack and


input are equal*/
{
for(k=size[row][col]-1;k>=0;k--) /* to replace
non terminal by its production*/
{
stack[i]=m[row][col][k];
i++;
}
i--; /* points to top of stack*/
}
if(m[row][col][0]=='E') /* to check error entry*/
{
if(i>0)
printf("\nERROR....\n");
else
flag=1;
exit(0);

2
}
if(m[row][col][0]=='n') /*to check for epsilon*/
i--;

for(k=0;k<=i;k++)
printf("%c",stack[k]); /* Display stack
contents*/
printf("\t\t");
for(k=j;k<=n;k++)
printf("%c",ip[k]); /* Display input contents*/
printf("\n");
}
return 0;
}

3
/*Pgm4: Shift-Reduce Parsing*/
#include<stdio.h>
#include<string.h>
int z=0,i=0,j=0,c=0; //c for length of string, i for stack, j for
//input and z for check function
char a[16],ac[20],stk[15],act[10]; //act[ ] for shift and ac[ ]
for //reduce
void check(); // to check top of stack
void main()
{
printf("GRAMMER is E->E+T|T \n T->T*F|F \n F->(E) \n F->
id");
printf("enter input string\n");
scanf("%s",a);
c=strlen(a);
strcpy(act,"SHIFT->"); //initial configuration
printf("stack \t input \t action");
//printf("\n---------------------------------------\ n†);
for(i=0; j<c; i++,j++)
{
if(a[j]=='i' && a[j+1]=='d') //checks the input for
"id"
{
stk[i]=a[j];
stk[i+1]=a[j+1]; //shift id to stack
stk[i+2]='\0';
a[j]=' '; //delete "id" from input array
a[j+1]=' ';
printf("\n$%s\t%s$\t%sid",stk,a,act);
//displays the first line SHIFT->id
check();
}
else
{
stk[i]=a[j];
stk[i+1]='\0';
a[j]=' ';
printf("\n$%s\t%s$\t%sSYMBOLS",stk,a,act);
//print SHIFT->symbols for inputs like +,*
check();
}
}
if((strcmp(stk,"E")==0)) //at the end of input if stack
holds "E"
printf("\n---------\n SUCCESS!!!!!!!!!!\n");
else
printf("\n-----------------\nERROR!!!!!!\n");
}
void check()
{
strcpy(ac,"REDUCE "); //dispaly REDUCE
for(z=0;z<c;z++)

1
if(stk[z]=='(' && stk[z+1]=='E' && stk[z+2]==')')
//if stack holds (E)
{
stk[z]='F'; //reduce to F
stk[z+1]='\0';
printf("\n$%s\t%s$\t%s",stk,a,ac);
i=i-2; //top of stack holds F
}
for(z=0;z<c;z++) // if stack holds id
if(stk[z]=='i' && stk[z+1]=='d')
{
stk[z]='F';
stk[z+1]='\0';
printf("\n$%s\t%s$\t%s",stk,a,ac);
j++; //move input pointer
}
for(z=0;z<c;z++) // if stack holds T*F
{
if(stk[z]=='T' && stk[z+1]=='*' && stk[z+2]=='F')
{
stk[z]='T';
stk[z+1]='\0';
printf("\n$%s\t%s$\t%s",stk,a,ac);
i=i-2;
}
else if(stk[z]=='F')
{
stk[z]='T';
printf("\n$%s\t%s$\t%s",stk,a,ac);
}
}
for(z=0;z<c;z++) //checks for stack E+T*
{
if(stk[z]=='E' && stk[z+1]=='+' && stk[z+2]=='T'&&
stk[z+3]=='*')
break;
if(stk[z]=='E' && stk[z+1]=='+' && stk[z+2]=='T'&&
a[j+1]=='*')
//stack is E+T and ip is *
break;
else if(stk[z]=='E' && stk[z+1]=='+' && stk[z+2]=='T')
//stack is E+T
{
stk[z]='E';
stk[z+1]='\0';
printf("\n$%s\t%s$\t%s",stk,a,ac);
i=i-2;
return;
}
}
for(z=0;z<c;z++)
{

2
if(stk[z]=='T')
if (a[j+1]=='*')
break;
else if(stk[z+1]=='*')
break;
else
{
stk[z]='E';
printf("\n$%s\t%s$\t%s",stk,a,ac);
}
}
}

/*
input string (id*id+id)
stack input action
$( id*id+id)$ SHIFT->SYMBOLS
$(id *id+id)$ SHIFT->id
$(F *id+id)$ REDUCE
$(T *id+id)$ REDUCE
$(T* id+id)$ SHIFT->SYMBOLS
$(T*id +id)$ SHIFT->id
$(T*F +id)$ REDUCE
$(T +id)$ REDUCE
$(T +id)$ REDUCE
$(E +id)$ REDUCE
$(E +id)$ REDUCE
$(E+ id)$ SHIFT->SYMBOLS
$(E+id )$ SHIFT->id
$(E+F )$ REDUCE
$(E+T )$ REDUCE
$(E )$ REDUCE
$(E) $ SHIFT->SYMBOLS
$F $ REDUCE
$T $ REDUCE
$E $ REDUCE
---------
SUCCESS!!!!!!!!!!

input string id-id


stack input action
$id -id$ SHIFT->id
$F -id$ REDUCE
$T -id$ REDUCE
$E -id$ REDUCE
$E- id$ SHIFT->SYMBOLS
$E-id $ SHIFT->id
$E-F $ REDUCE
$E-T $ REDUCE
$E-E $ REDUCE
-----------------
ERROR!!!!!!

3
*/

4
/*5.Design, develop and implement a C/Java program to generate the machine code using Triples
for the statement A = -B * (C+D) whose intermediate code in three-address form:
T1 = -B
T2 = C + D
T3 = T1 * T2
A = T3 */
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
char tset[4][3][3]= { {"-","B","?"},
{"+","C","D"},
{"*","0","1"},
{"=","A","2"}
};
int main()
{
int row,col;
printf("Input statement is:A = -B * (C+D)\n");
printf("Intermediate code in three address form is:\nT1 = -B\nT2 = C + D\nT3 = T1 * T2\nA
=T3\n");
printf("Triples are:\n"); //Display the table
for(row=0;row<4;row++)
{
printf("%d\t", row);
for(col=0; col<3; col++)
printf("%c\t", tset[row][col][0]);
printf("\n");
}
printf("Machine code generated is:\n");
for(row=0;row<4;row++)
{
if (tset[row][2][0]=='?')
{
printf("\nLD R0,%s%s",tset[row][0],tset[row][1]);
}
else
{
if(tset[row][0][0]=='+')
{
printf("\nLD R1,%s",tset[row][1]);
printf("\nLD R2,%s",tset[row][2]);
printf("\nADD R1,R1,R2");
}
else
{
if(tset[row][0][0]=='*')
printf("\nMUL R0,R0,R1");
else
printf("\nST %s,R0",tset[row][1]);
}
}
}
printf("\n");
return 0;
}
Write YACC program to recognize valid identifier, operators and keywords in the given
text (C program) file.

/*YACC program*/
%{
#include "lex.yy.c"
int id=0, dig=0, key=0, op=0, lit=0, par=0, inv=0;
%}
%token DIGIT ID KEY OP LIT PAR INV
%%
input:
DIGIT input { dig++; }
| ID input  { id++; }
| KEY input { key++; }
| OP input  { op++; }
| LIT input { lit++; }
| PAR input  { par++; }
| INV input { inv++; }
| DIGIT     { dig++; }
| ID        { id++; }
| KEY       { key++; }
| OP        { op++;}
| LIT       { lit++; }
| PAR       { par++; }
| INV       { inv++; }
;
%%
main(int argc, char **argv)
{
   FILE *f1 = fopen(argv[1], "r");
   if(!f1)
   {
      printf("File cannot be opened\n");
      exit(0);
   }
   yyin = f1;
   do
   {
      yyparse();
   } while(!feof(yyin));
   printf("Numbers = %d\n Keywords = %d\n Identifiers = %d\n Operators= %d\n Literals =
%d\n Parenthesis = %d\n", dig, key, id, op, lit, par);
}
void yyerror()
{
   printf("Parse error! Message: ");
   exit(0);
}

/*LEX program*/
%{
#include "y.tab.h"
extern yylval;
%}

%%
[ \t]       ;
[(|)]     {printf("%s  ->  parenthesis\n",yytext); return PAR;}
"\"".*"\""              {printf("%s  ->  literal\n",yytext); return LIT;}
[+|-|*|/|=|<|>]         {printf("%s  ->  operator\n",yytext); return OP;}
[0-9]+|[0-9]*[.][0-9]+  {printf("%s  -> number\n",yytext); yylval =atoi(yytext); return DIGIT;}
int|char|bool|float|void|for|do|while|if|else|return|void {printf("%s  ->  keyword\n",yytext);
return KEY;}
[a-zA-Z][a-zA-Z0-9_]*   {printf("%s  ->  identifier\n",yytext); return ID;}
[0-9]+[a-zA-Z]*         {printf("%s  ->  invalid identifier\n",yytext); return INV;}
.      ;
%%

—------------------------------------------------------------------------------------------------------------------

[student@localhost ssn]$ vi inp.c


#include<stdio.h>
main()
{
   int a1, 1b, sum=1.2;
   printf("Enter values for a and b\n");
   scanf("%d %d", a1, 1b);
   sum = a1+1b;
   printf("Sum = %d\n", sum);
}
/* Experiment 7: Design, develop and implement a C/C++/Java program to simulate the working of Shortest remaining time and
Round Robin (RR) scheduling algorithms. Experiment with different quantum sizes for RR algorithm.*/

#include<stdio.h>
#include<stdlib.h>
struct proc //structure to hold the process information
{
int id;
int arrival;
int burst;
int rem;
int wait;
int finish;
int turnaround;
float ratio;
} process[10];
struct proc temp;
int no;
int chkprocess(int);
int nextprocess();
void roundrobin(int, int, int[], int[]);
void srtf(int);
main()
{
int n,tq,choice;
int bt[10],st[10],i,j,k;
for(; ;)
{
printf("Enter the choice\n");
printf(" 1. Round Robin\n 2. SRT\n 3. Exit\n");
scanf("%d",&choice);
switch(choice)
{
case 1: printf("Round Robin scheduling algorithm\n");
printf("Enter number of processes:\n");
scanf("%d",&n);
printf("Enter burst time for sequences:\n");
for(i=0;i<n;i++)
{
scanf("%d",&bt[i]);
st[i]=bt[i]; //service time
}
printf("Enter time quantum:");
scanf("%d",&tq);
roundrobin(n,tq,st,bt);
break;
case 2: printf("\n\n---SHORTEST REMAINING TIME NEXT---\n\n ");
printf("\n\n Enter the number of processes: ");
scanf("%d", &n);
srtf(n);
break;
case 3: exit(0);
} // end of switch
} // end of for
} //end of main()

void roundrobin(int n,int tq,int st[],int bt[])


{
int time=0;
int tat[10],wt[10],i,count=0,swt=0,stat=0,temp1,sq=0,j,k;
float awt=0.0,atat=0.0;
while(1)
{
for(i=0,count=0;i<n;i++)
{
temp1=tq;
if(st[i]==0) // when service time of a process equals zero then
{
count++; //count value is incremented
continue;
}
if(st[i]>tq) // when service time of a process greater than time quantum
st[i]=st[i]-tq; // then time quantum value subtracted from service time
else
if(st[i]>=0)
{
temp1=st[i]; // temp1 stores the service time of a process
st[i]=0; // making service time equals 0
}
sq=sq+temp1; // utilizing temp1 value to calculate turnaround time
tat[i]=sq; // turn around time
} //end of for
if(n==count) // if all processes have completed their task
break;
} //end of while
for(i=0;i<n;i++) // to calculate the wait time and turnaround time of each process
{
wt[i]=tat[i]-bt[i]; // waiting time = turnaround time - bursttime
swt=swt+wt[i]; // summation of wait time
stat=stat+tat[i]; // summation of turnaround time
}
awt=(float)swt/n; // average wait time
atat=(float)stat/n; // average turnaround time

printf("Process_no Burst time Wait time Turn around time\n");


for(i=0;i<n;i++)
printf("%d\t\t%d\t\t%d\t%d\n",i+1,bt[i],wt[i],tat[i]);
printf("Avg wait time is %f\nAvg turn around time is %f\n",awt,atat);
}// end of Round Robin

int chkprocess(int s) // function to check process remaining time is zero or not


{
int i;
for(i = 1; i<=s; i++)
{
if(process[i].rem != 0)
return 1;
}
return 0;
} // end of chkprocess

int nextprocess() // function to identify the next process to be executed


{
int min, l, i;
min = 32000; //any limit assumed
for(i = 1; i<=no; i++)
{
if( process[i].rem!=0 && process[i].rem < min)
{
min = process[i].rem;
l = i;
}
}
return l;
} // end of nextprocess

void srtf(int n)
{
int i,j,k,time=0;
float tavg,wavg;
for(i = 1; i<=n; i++)
{
process[i].id = i;
printf("\n\nEnter the arrival time for process %d: ", i);
scanf("%d", &(process[i].arrival));
printf("Enter the burst time for process %d: ", i);
scanf("%d", &(process[i].burst));
process[i].rem = process[i].burst;
}
for(i = 1; i<=n; i++)
{
for(j = i + 1; j<=n; j++)
{
if(process[i].arrival > process[j].arrival) //sort arrival time of a process
{
temp = process[i];
process[i] = process[j];
process[j] = temp;
}
}
}
no = 0;
j = 1;
while(chkprocess(n)==1)
{
if(process[no + 1].arrival==time)
{
while(process[no+1].arrival==time)
no++;
if(process[j].rem==0)
process[j].finish=time;
j = nextprocess();
}
if(process[j].rem!= 0) // to calculate the waiting time of a process
{
process[j].rem--;
for(i = 1; i<=no; i++)
{
if(i!=j && process[i].rem!=0)
process[i].wait++;
}
}
else
{
process[j].finish=time;
j=nextprocess();
time--;
k=j;
}
time++;
}
process[k].finish = time;
printf("\n\n\t\t\t---SHORTEST REMAINING TIME FIRST---");
printf("\n\n Process Arrival Burst Waiting Finishing turnaround Tr/Tb \n");
printf("%5s %9s %7s %10s %8s %9s\n\n", "id", "time", "time", "time", "time", "time");
for(i = 1; i<=n; i++)
{
process[i].turnaround =process[i].wait + process[i].burst; // calc of turnaround
process[i].ratio = (float)process[i].turnaround / (float)process[i].burst;
printf("%5d %8d %7d %8d %10d %9d %10.1f ", process[i].id, process[i].arrival,
process[i].burst, process[i].wait, process[i].finish,
process[i].turnaround,process[i].ratio);

tavg=tavg+process[i].turnaround; //summation of turnaround time


wavg=wavg+process[i].wait; //summation of waiting time
printf("\n\n");
}
tavg=tavg/n; // average turnaround time
wavg=wavg/n; // average wait time
printf("tavg=%f\n wavg=%f\n",tavg,wavg);
}// end of srtf

Sample Output
Enter the choice
1. Round Robin
2. SRT
3. Exit
1
Round Robin scheduling algorithm
Enter number of processes:
3
Enter burst time for sequences:
24
3
3
Enter time quantum:4
Process_no Burst time Wait time Turn around time
1 24 6 30
2 3 4 7
3 3 7 10
Avg wait time is 5.666667
Avg turn around time is 15.666667

Enter the choice


1. Round Robin
2. SRT
3. Exit
2
---SHORTEST REMAINING TIME NEXT---

Enter the number of processes: 4

Enter the arrival time for process 1: 0


Enter the burst time for process 1: 8

Enter the arrival time for process 2: 1


Enter the burst time for process 2: 4

Enter the arrival time for process 3: 2


Enter the burst time for process 3: 9

Enter the arrival time for process 4: 3


Enter the burst time for process 4: 5

---SHORTEST REMAINING TIME FIRST---


Process Arrival Burst Waiting Finishing turnaround Tr/Tb
id time time time time time

1 0 8 9 17 17 2.1

2 1 4 0 5 4 1.0

3 2 9 15 26 24 2.7

4 3 5 2 10 7 1.4

tavg=13.000000
wavg=6.500000
Enter the choice
1. Round Robin
2. SRT
3. Exit
3
/*Experiment 9: Design, develop and implement a C/C++/Java
program to implement page replacement algorithms LRU and
FIFO. Assume suitable input required to demonstrate the results.*/

#include<stdio.h>
int n,nf,in[100],p[50],hit=0,i,j,k,pgfaultcnt=0;
void getData()
{
printf("\nEnter length of page reference sequence:");
scanf("%d",&n);
printf("\nEnter the page reference sequence:");
for(i=0; i<n; i++)
scanf("%d",&in[i]);
printf("\nEnter no of frames:");
scanf("%d",&nf);
}
void initialize()
{
pgfaultcnt=0;
for(i=0; i<nf; i++)
p[i]=9999;
}
int isHit(int data)
{
hit=0;
for(j=0; j<nf; j++)
{
if(p[j]==data)
{
hit=1;
break;
}
}
return hit;
}
void dispPages()
{
for(k=0; k<nf; k++)
{
if(p[k]!=9999)
printf(" %d",p[k]);
}
}
void fifo()
{
initialize();
int m=0;
for(i=0; i<n; i++)
{
printf("\nFor %d :",in[i]);

if(isHit(in[i])==0)
{
p[m]=in[i];
m=(m+1)%nf;
pgfaultcnt++;
dispPages();
}
else
printf("No page fault");

}
printf("\nTotal no of page faults:%d",pgfaultcnt);
}
void lru()
{
initialize();
int least[50];
for(i=0; i<n; i++)
{
printf("\nFor %d :",in[i]);
if(isHit(in[i])==0)
{
for(j=0; j<nf; j++)
{
int pg=p[j];
int found=0;
for(k=i-1; k>=0; k--)
{
if(pg==in[k])
{
least[j]=k;
found=1;
break;
}
else
found=0;
}
if(!found)
least[j]=-9999;
}
int min=9999;
int repindex;
for(j=0; j<nf; j++)
{
if(least[j]<min)
{
min=least[j];
repindex=j;
}
}
p[repindex]=in[i];
pgfaultcnt++;
dispPages();
}
else
printf("No page fault!");
}
printf("\nTotal no of page faults:%d",pgfaultcnt);
}
int main()
{
int choice;
while(1)
{
printf("\nPage Replacement Algorithms\n1.Enter data\n
2.FIFO\n 3.LRU\n 4.Exit\n Enter your choice:");
scanf("%d",&choice);
switch(choice)
{
case 1:getData();
break;
case 2:fifo();
break;
case 3:lru();
break;
default:return 0;
break;
}
}
}

Sample Output:

Page Replacement Algorithms


1.Enter data
2.FIFO
3.LRU
4.Exit

Enter your choice:1

Enter length of page reference sequence:8

Enter the page reference sequence: 2 1 3 2 3 0 1 3

Enter no of frames:3

Page Replacement Algorithms


1.Enter data
2.FIFO
3.LRU
4.Exit
Enter your choice:2
For 2 : 2
For 1 : 2 1
For 3 : 2 1 3
For 2 : No page fault
For 3 : No page fault
For 0 : 0 1 3
For 1 : No page fault
For 3 : No page fault
Total no of page faults:4

Page Replacement Algorithms


1.Enter data
2.FIFO
3.LRU
4.Exit
Enter your choice:3

For 2 : 2
For 1 : 2 1
For 3 : 2 1 3
For 2 :No page fault!
For 3 :No page fault!
For 0 : 2 0 3
For 1 : 1 0 3
For 3 :No page fault!
Total no of page faults:5

Page Replacement Algorithms


1.Enter data
2.FIFO
3.LRU
4.Exit

Enter your choice:4

You might also like