我正在使用来自 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.
我真的很感谢你的回答。