I'm using the code for Shift-Reduce Parsers from geeksforgeeks and changed a few rules and my rule are:
- P->E,
- E->E + T
- T->T*F | F
- F->( E ) | id
void check()
{
// Coping string to be printed as action
strcpy(ac,"REDUCE TO -> ");
// c=length of input string
// checking for producing rule P->E
if(stk[0] == 'E')
{
printf("%sE", ac);
stk[0] = 'P';
stk[1] = '\0';
//pinting action
printf("\n$%s\t%s$\t", stk, a);
}
for(z = 0; z E + T | T
if((stk[z] == 'E' && stk[z + 1] == ' ' && stk[z + 2] == '+'
&& stk[z + 3] == ' ' && stk[z + 4] == 'T'))
{
printf("%sE + T", ac);
stk[z] = 'E';
stk[z + 1]='\0';
stk[z + 2]='\0';
stk[z + 3]='\0';
stk[z + 4]='\0';
printf("\n$%s\t%s$\t", stk, a);
i = i - 4;
}
else if(stk[z] == 'T')
{
printf("%sT", ac);
stk[z] = 'E';
stk[z + 1]= '\0';
printf("\n$%s\t%s$\t", stk, a);
}
}
for(z = 0; z T * F | F
if((stk[z] == 'T' && stk[z + 1] == ' ' && stk[z + 2] == '*'
&& stk[z + 3] == ' ' && stk[z + 4] == 'F'))
{
printf("%sT * F", ac);
stk[z] = 'T';
stk[z + 1]='\0';
stk[z + 2]='\0';
stk[z + 3]='\0';
stk[z + 4]='\0';
printf("\n$%s\t%s$\t", stk, a);
i = i - 4;
}
else if(stk[z] == 'F')
{
printf("%sF", ac);
stk[z] = 'T';
stk[z + 1]= '\0';
printf("\n$%s\t%s$\t", stk, a);
}
}
for(z = 0; z ( E ) | id
if((stk[z] == '(' && stk[z + 1] == ' ' && stk[z + 2] == 'E' && stk[z + 3] == ' ' && stk[z + 4] == ')'))
{
printf("%s( E ) | id", ac);
stk[z] = 'F';
stk[z + 1]='\0';
stk[z + 2]='\0';
stk[z + 3]='\0';
stk[z + 4]='\0';
printf("\n$%s\t%s$\t", stk, a);
i = i - 4;
}
else if(stk[z] == 'i' && stk[z+1] == 'd')
{
printf("%sid", ac);
stk[z] = 'F';
stk[z + 1]='\0';
printf("\n$%s\t%s$\t", stk, a);
i -= 1;
}
}
return ; // return to main
}
I'm using the code from geeksforgeeks.org and changed a few rules and just changed the input to "( id + id )" and this occurs. I have tried many ways but the output still the same as previous. Here is my output.
| stack| input | action |
| -----| ---------------- | ---------------------|
|$ |( id + id ) * id$ | SHIFT |
|$( | id + id ) * id$ | SHIFT |
|$( | id + id ) * id$ | SHIFT |
|$( i | d + id ) * id$ | SHIFT |
|$( id | + id ) * id$ | REDUCE TO -> id |
|$( F | + id ) * id$ | SHIFT |
|$( F | + id ) * id$ | REDUCE TO -> F |
|$( T | + id ) * id$ | SHIFT |
|$( T | + id ) * id$ | SHIFT |
|$( T | id ) * id$ | REDUCE TO -> T |
|$( E | id ) * id$ | SHIFT |
Everything is fine until it shift char '+' to stack and it became '\0'. And the code runs till the end with stack $( E.
I really appreciate your answer.