Missing shifted value in Shift-Reduce Parsers

54 Views Asked by At

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.

0

There are 0 best solutions below