Sunday, October 9, 2011

Eliminate Left Recursion -- simple

Share Orkut
#include<stdio.h>
#include<string.h>
char inp[50][50];
char out[50][50];
void im_rec(int);
int out_ptr=0,len;
int main(){
   int i=0,j,f=0;
   char key[2];
   printf("Enter the grammer. Enter 's' to stop\n");
   while(1){
     scanf("%s",inp[i]);
     if(strcmp(inp[i],"s")==0)
       break;
     i++;
   }
   len=i;
   for(i=0;i<len;i++){
     f=0;
     for(j=0;inp[i][j]!='\0';j++){
       if((inp[i][j]=='>' || inp[i][j]=='|') && inp[i][j+1]==inp[i][0]){
         im_rec(i);
         f=1;
         break;
       }
     }
     if(f==0)
       strcpy(out[out_ptr++],inp[i]);
   }
   printf("Grammer without Left Recursion\n");
   for(i=0;i<out_ptr;i++)
     printf("%s\n",out[i]);
   return 0;
}
void im_rec(int i){
   int j=0,outj=2,outj1=3;
   char ep[11]="|epsilon";
   ep[8]='\0';
   out[out_ptr][j]=inp[i][j];
   out[out_ptr+1][j]=inp[i][j];
   out[out_ptr][++j]='-';
   out[out_ptr+1][j]='\'';
   out[out_ptr][++j]='>';
   out[out_ptr+1][j]='-';
   out[out_ptr+1][++j]='>';
   do{
     if((inp[i][j-1]=='>' || inp[i][j-1]=='|') && inp[i][j]==inp[i][0]){
       j++;
       if(out[out_ptr+1][outj1]!='>')
         out[out_ptr+1][++outj1]='|';
       while(inp[i][j]!='\0' && inp[i][j]!='|')
         out[out_ptr+1][++outj1]=inp[i][j++];
       out[out_ptr+1][++outj1]=inp[i][0];
       out[out_ptr+1][++outj1]='\'';
      }
     else{
       if(out[out_ptr][outj]!='>')
         out[out_ptr][++outj]='|';
       while(inp[i][j]!='\0' && inp[i][j]!='|')
          out[out_ptr][++outj]=inp[i][j++];
       out[out_ptr][++outj]=inp[i][0];
       out[out_ptr][++outj]='\'';
      }
   }while(inp[i][j++]!='\0');
   out[out_ptr][++outj]='\0';
   out[out_ptr+1][++outj1]='\0';
   strcat(out[out_ptr+1],ep);
   out_ptr+=2;
}

Operator precedence parser -- simple

Share Orkut

E -> E + E | E * E | id

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
char table[4][4]={'0','>','>','>',
       '<','>','<','>',
       '<','>','>','>',
       '<','<','<','0'};
char tab_ordr[4]={'i','+','*','$'};
char stack[100];
int stkPtr=-1;
void push(char);
char pop();
char peek();
void error();
int preced(char,char);
int main(){
   char str[20],temp,t[10];
   int len,inp_ptr=0,prec,countOfI=0;
   printf("Enter the expression:- ");
   scanf("%s",str);
   push('$');
   len=strlen(str);
   str[len]='$';
   str[len+1]='\0';
   while(str[inp_ptr]!='$' || peek()!='$')
   {
     if(str[inp_ptr]>='0'&&str[inp_ptr]<='9'){
       while(str[inp_ptr]>='0' && str[inp_ptr]<='9')
         inp_ptr++;
       str[--inp_ptr]='i';
   }
   prec=preced(peek(),str[inp_ptr]);
   if(prec==0){
     if(str[inp_ptr]=='i')
       countOfI++;
     else
       countOfI--;
     push(str[inp_ptr++]);
   }
   else if(prec==1){
     do{
       temp=pop();
     }while(preced(peek(),temp)!=0);
   }
   else
     error();
   }
   if(countOfI!=1)
     error();
   printf("Success\n",countOfI);
   return 0;
}
void push(char a){
   stack[++stkPtr]=a;
}
char pop(){
   return stack[stkPtr--];
}
char peek(){
   return stack[stkPtr];
}
void error(){
   printf("Error\n");
   exit(1);
}
int preced(char a,char b)
{
   int i,j;
   for(i=0;i<4;i++){
     if(tab_ordr[i]==a)
       break;
   }
   for(j=0;j<4;j++){
     if(tab_ordr[j]==b)
       break;
   }
   if(i==4 || j==4)
     error();
   else{
     if(table[i][j]=='<')
       return 0;
     else if(table[i][j]=='>')
       return 1;
     else
       return 2;
   }
}

Shift reduce parser-- simple

Share Orkut

E -> E + E | E * E | id

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str[100],stack[100];
int stkPtr=-1;
void push(char);
char pop();
char peek();
void error();
int main(){
   int i,len,k;
   printf("Enter the expression:- ");
   gets(str);
   push('$');
   len=strlen(str);
   str[len]='$';
   str[len+1]='\0';
   for(i=0;i<len;i++){
     if(str[i]>='0' && str[i]<='9'){
       while(str[i+1]>='0'&&str[i+1]<='9')
         i++;
       push('E');
     }
     else if(str[i]=='+' || str[i]=='-' || str[i]=='/' || str[i]=='*')
       push(str[i]);
     else
       error();
   }
   while(stkPtr>=3){
     if(stack[stkPtr]=='E' && (stack[stkPtr-1]=='+' || stack[stkPtr-1]=='-' || stack[stkPtr-1]=='*' || stack[stkPtr-1]=='/') && stack[stkPtr-2]=='E'){
     pop();
     pop();
   }
   else
     error();
   }
   if(stack[stkPtr]=='E' && stack[stkPtr-1]=='$')
     printf("SUCCESS\n");
   else
     error();
   return 0;
}
void push(char a){
   stack[++stkPtr]=a;
}
char pop(){
   return stack[stkPtr--];
}
char peek(){
   return stack[stkPtr];
}
void error(){
   printf("ERROR\n");
   exit(1);
}