1

我正在使用来自 geeksforgeeks 的 Shift-Reduce Parsers 代码并更改了一些规则,我的规则是:

  • 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
    }

我正在使用来自 geeksforgeeks.org 的代码并更改了一些规则并将输入更改为“(id + id)”并且发生了这种情况。我尝试了很多方法,但输出仍然与以前相同。这是我的输出。

| 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         |

一切都很好,直到它将 char '+' 转换为堆栈并变为 '\0'。代码运行到最后,堆栈 $( E.

我真的很感谢你的回答。

4

0 回答 0