📄
字号:
}
if((lr1<10)&&(lr1>=0))
{
sp1++;
stack1[sp1]=lr1;
if(n1.syl!=tempsy)
{
ssp++;
num++;
sstack[ssp].syl=n1.syl;
sstack[ssp].pos=n1.pos;
}
n1.syl=ibuf[num].syl;
n1.pos=ibuf[num].pos;
lrparse1(num);
}
if((lr1>=100)&&(lr1<105))
{
switch(lr1)
{
case 100: break;
case 101:
E.pos=newtemp();
gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].syl=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
case 102:
E.pos=newtemp();
gen("*",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].syl=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
case 103:
E.pos=sstack[ssp-1].pos;
ssp=ssp-2;
sstack[ssp].syl=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
case 104:
E.pos=sstack[ssp].pos;
sp1--;
break;
}
n1.syl=tempsy;
n1.pos=E.pos;
lrparse1(num);
}
if((lr1==ACC)&&(stack1[sp1]==1))
{
gen("=",sstack[ssp],oth,ibuf[0].pos);
ssp=ssp-3;
sp1=sp1-3;
}
}
/*************************/
lrparse2(int num)
{
int templabel;
lr1=action2[stack1[sp1]][change2(n1.syl)];
if(g++==4) getch();
printf("\tstack2[%d]=%d\t\t n2=%d\t\tlr2=%d\n",sp1,stack[sp1].pos,n1.syl,lr1);
if(lr1==-1)
{
if(sign==2) printf("\n while Error!\n ");
if(sign==3) printf("\n if Error!\n");
getch();
/*exit(0);*/
}
if((lr1<16)&&(lr1>=0))
{
sp1++;
stack1[sp1]=lr1;
ssp++;
sstack[ssp].syl=n1.syl;
sstack[ssp].pos=n1.pos;
if((n1.syl!=tempsy)&&(n1.syl!=EA)&&(n1.syl!=EO)) num++;
n1.syl=ibuf[num].syl;
n1.pos=ibuf[num].pos;
lrparse2(num);
}
if((lr1>=100)&&(lr1<109))
{
switch(lr1)
{
case 100: break;
case 101:
ntab2[label].tc=nxq;
ntab2[label].fc=nxq+1;
gen("jnz",sstack[ssp],oth,0);
gen("j",oth,oth,0);
sp1--;
ssp--;
label++;
n1.syl=tempsy;
break;
case 102:
ntab2[label].tc=nxq;
ntab2[label].fc=nxq+1;
switch(sstack[ssp-1].pos)
{
case 0:
gen("j<=",sstack[ssp-2],sstack[ssp],0);
break;
case 1:
gen("j<",sstack[ssp-2],sstack[ssp],0);
break;
case 2:
gen("j>=",sstack[ssp-2],sstack[ssp],0);
break;
case 3:
gen("j>",sstack[ssp-2],sstack[ssp],0);
break;
case 4:
gen("j<>",sstack[ssp-2],sstack[ssp],0);
break;
case 5:
gen("j=",sstack[ssp-2],sstack[ssp],0);
break;
}
gen("j",oth,oth,0);
ssp=ssp-3;
sp1=sp1-3;
label++;
n1.syl=tempsy;
break;
case 103:
label=label-1;
ssp=ssp-3;
sp1=sp1-3;
label++;
n1.syl=tempsy;
break;
case 104:
label=label-1;
templabel=ntab2[label].tc;
ntab2[label].tc=ntab2[label].fc;
ntab2[label].fc=templabel;
ssp=ssp-2;
sp1=sp1-2;
label++;
n1.syl=tempsy;
break;
case 105:
backpatch(ntab2[label-1].tc,nxq);
label=label-1;
ssp=ssp-2;
sp1=sp1-2;
label++;
n1.syl=EA;
break;
case 106:
label=label-2;
ntab2[label].fc=ntab2[label+1].tc;
ntab2[label].fc=merg(ntab2[label].fc,ntab2[label+1].fc);
ssp=ssp-2;
sp1=sp1-2;
label++;
n1.syl=tempsy;
break;
case 107:
backpatch(ntab2[label-1].fc,nxq);
label=label-1;
ssp=ssp-2;
sp1=sp1-2;
label++;
n1.syl=EO;
break;
case 108:
label=label-2;
ntab2[label].fc=ntab2[label+1].fc;
ntab2[label].tc=merg(ntab2[label].tc,ntab2[label+1].tc);
ssp=ssp-2;
sp1=sp1-2;
label++;
n1.syl=tempsy;
break;
}
lrparse2(num);
}
if(lr1==ACC) return 1;
}
/********************************/
test(int value)
{
switch(value)
{
case intconst:
case ident:
case plus:
case times:
case becomes:
case lparent:
case rparent:
case rop:
case op_and:
case op_or:
case op_not:
return 1;
default: return 0;
}
}
/**********************************/
lrparse()
{
int i1=0;
int num=0;
if(test(n.syl))
{
if(stack[sp].syl==syl_while) sign=2;
else
{
if(stack[sp].syl==syl_if) sign=3;
else sign=1;
}
do
{
ibuf[i1].syl=n.syl;
ibuf[i1].pos=n.pos;
if(ibuf[i1].syl==rparent)
{
readnu();
i1++;
break;
}
readnu();
i1++;
}while(test(n.syl));
ibuf[i1].syl=jinghao;
pbuf--;
sstack[0].syl=jinghao;
ssp=0;
if(sign==1)
{
sp1=0;
stack1[sp1]=0;
num=2;
n1.syl=ibuf[num].syl;
n1.pos=ibuf[num].pos;
printf("\nThe follwing stack is for suan shu biao da shi\n");
g=0;
lrparse1(num);
printf("then ,gui yue wei 'a' \n\n");
n.syl=a;
}
if((sign==2) || (sign==3))
{
pointmark++;
labelmark[pointmark].nxq1=nxq;
sp1=0;
stack1[sp1]=0;
num=0;
n1.syl=ibuf[num].syl;
n1.pos=ibuf[num].pos;
printf("\nThe follwing stack is for boolean biao da shi\n");
g=0;
lrparse2(num); printf("then ,gui yue wei 'e' \n\n");
labelmark[pointmark].tc1=ntab2[label-1].tc;
labelmark[pointmark].fc1=ntab2[label-1].fc;
backpatch(labelmark[pointmark].tc1,nxq);
n.syl=e;
}
}
lr=action[stack[sp].pos][n.syl];
printf("stack[%d]=%d\t\t n=%d\t\tlr=%d\n",sp,stack[sp].pos,n.syl,lr);
if((lr<20)&&(lr>=0))
{
sp++;
stack[sp].pos=lr;
stack[sp].syl=n.syl;
readnu();
lrparse();
}
if((lr<=106)&&(lr>=100))
{
switch(lr)
{
case 100: break;
case 101:
printf("s->if e s else s guiyue\n");
sp=sp-5;
n.syl=s;
fexp[labeltemp[pointtemp]].result=nxq;
pointtemp--;
if(stack[sp-1].syl==syl_if)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
pointmark--;
if(stack[sp-1].syl==syl_while)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
break;
case 102:
printf("s->while e s guiyue \n");
sp=sp-3;
n.syl=s;
pointmark--;
if(stack[sp-1].syl==syl_while)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
if(stack[sp-1].syl==syl_if)
{
gen("j",oth,oth,0);
fexp[labelmark[pointmark].fc1].result=nxq;
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
break;
case 103:
printf("s->{ L } guiyue \n");
sp=sp-3;
n.syl=s;
if(stack[sp-1].syl==syl_if)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
if(stack[sp-1].syl==syl_while)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
getch();
break;
case 104:
printf("s->a; guiyue \n");
sp=sp-2;
n.syl=s;
if(stack[sp-1].syl==syl_if)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
if(stack[sp-1].syl==syl_while)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
break;
case 105:
printf("L->s guiyue\n");
sp=sp-1;
n.syl=L;
break;
case 106:
printf("L->SL guiyue\n");
sp=sp-2;
n.syl=L;
break;
}
getch();
pbuf--;
lrparse();
}
if(lr==ACC) return ACC;
}
/*********************************/
disp1()
{
int temp1=0;
printf("\n.........chi fa fen xi ........\n");
for(temp1=0;temp1<count;temp1++)
{
printf("%d\t%d\n",buf[temp1].syl,buf[temp1].pos);
if(temp1==20)
{
printf("Press any key to continue...\n");
getch();
}
}
getch();
}
/*******************************/
disp2()
{
int temp1=100;
printf("\n-------si yuan shi-------\n");
for(temp1=100;temp1<nxq;temp1++)
{
printf("%d\t",temp1);
printf("(%s,\t",fexp[temp1].op);
if(fexp[temp1].arg1.syl==ident)
printf("%s,\t",ntab1[fexp[temp1].arg1.pos]);
else
{
if(fexp[temp1].arg1.syl==tempsy)
printf("T%d,\t",fexp[temp1].arg1.pos);
else
{
if(fexp[temp1].arg1.syl==intconst)
printf("%d,\t",fexp[temp1].arg1.pos);
else printf("\t");
}
}
if(fexp[temp1].arg2.syl==ident)
printf("%s,\t",ntab1[fexp[temp1].arg2.pos]);
else
{
if(fexp[temp1].arg2.syl==tempsy)
printf("T%d,\t",fexp[temp1].arg2.pos);
else
{
if(fexp[temp1].arg2.syl==intconst)
printf("%d,\t",fexp[temp1].arg2.pos);
else printf(",\t");
}
}
if(fexp[temp1].op[0] != 'j')
{
if(fexp[temp1].result>=100)
printf("T%d\t)",fexp[temp1].result-100);
else
printf("%s\t)",ntab1[fexp[temp1].result]);
}
else printf("%d\t)",fexp[temp1].result);
if(temp1==20)
{
printf("\n Press any key to continue.....\n");
getch();
}
printf("\n");
}
getch();
}
/***********************************/
disp3()
{
int tttt;
printf("\n\n row %d, creat %d chan sheng shi\n",lnum,count);
getch();
printf("\n.....bian liang ming biao.........\n");
for(tttt=0;tttt<tt1;tttt++)
printf("%d\t%s\n",tttt,ntab1[tttt]);
getch();
}
/*********************************/
main()
{
cfile=fopen("source.dat","r");
clrscr();
readch();
scan();
disp1();
disp3();
stack[sp].pos=0;
stack[sp].syl=-1;
stack1[sp1]=0;
oth.syl=-1;
printf("\n..........zhuang tai zhan..........\n");
readnu();
lrparse();
getch();
disp2();
printf("\ncheng xu jie shu\n");
getch();
getch();
}
.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -