Shift-Reduce 解析器中缺少移位值

时间:2021-06-12 13:19:04

标签: c++ visual-studio-code shift-reduce

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

  • P->E,
  • E->E + T
  • T->T*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.

我被困在这里 3 天了,请帮忙。非常感谢。

0 个答案:

没有答案