z=panduanyou(fenxizhan[j]);// 从优先关系表中查出s[j]和a的优先关系 if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||a==')'||a=='#')
n=panduanyou(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
printf("error!不合法的句子");
break;
}
p6=youxian[z][n];
if(p6=='>')
{
loop: Q=fenxizhan[j];
if(fenxizhan[j-1]=='+'||fenxizhan[j-1]=='*'||fenxizhan[j-1]=='^'||fenxizhan[j-1]=='i'||fenxizhan[j-1]=='('||fenxizhan[j-1]==')'||fenxizhan[j-1]=='#') j=j-1;
else
j=j-2;
z1=panduanyou(fenxizhan[j]);
n1=panduanyou(Q);
p1=youxian[z1][n1];
if(p1=='<') //fenxizhan[j+1]…fenxizhan[k]归约为N
{
k=j+1;
shengyuchuan();
flag++;
printf("(%d) %s %c %c %s 归约
\n",flag,fenxizhan,p6,a,lex);
i--;
fenxizhan[k]='N';
int hou,hou1;
hou=strlen(fenxizhan);
for(hou1=k+1;hou1<hou;hou1++)
fenxizhan[hou1]='\0';//多个字符归约,把栈顶后面的舍弃
zengjia();//归约剩余串没变化
}
else
goto loop;
}
else
{
if(p6=='<') //移进 有一个问题就是如果上一步是不归约,剩余的字符串减少一个