?? pascal.cpp
字號(hào):
{
lr1=action1[stack1[sp1]][change1(g_nExpCurChar.type)];
if (lr1==-1)
{
printf("\n算術(shù)表達(dá)式或賦值語句出錯(cuò)!\n");
getchar();
exit(0);
}
if ((lr1<14)&&(lr1>=0))///////////////////////
{
sp1++;
stack1[sp1]=lr1;
if (g_nExpCurChar.type!=tempsy)
{
ssp++;
num++;
sstack[ssp].type=g_nExpCurChar.type;
sstack[ssp].pos=g_nExpCurChar.pos;
}
g_nExpCurChar.type=ibuf[num].type;
g_nExpCurChar.pos=ibuf[num].pos;
lrparse1(num);
}
if((lr1>=100)&&(lr1<107))///////////////////////////
{
switch(lr1)
{
case 100:
break;
case 101:
E.pos=newtemp();
gen("+",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].type=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
/*E->E+E*/
case 102:
E.pos=newtemp();
gen("*",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].type=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
/*E->E*E*/
case 103:
E.pos=sstack[ssp-1].pos;
ssp=ssp-2;
sstack[ssp].type=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
/*E->(E)*/
case 104:
E.pos=sstack[ssp].pos;
sp1--;
break;
/*E->i*/
case 105:
E.pos=newtemp();
gen("-",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].type=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
/*E->E-E*/
case 106:
E.pos=newtemp();
gen("/",sstack[ssp-2],sstack[ssp],E.pos+100);
ssp=ssp-2;
sstack[ssp].type=tempsy;
sstack[ssp].pos=E.pos;
sp1=sp1-3;
break;
/*E->E/E*/
}
g_nExpCurChar.type=tempsy;/*規(guī)約后為非終結(jié)符*/
g_nExpCurChar.pos=E.pos;
lrparse1(num);
}
if ((lr1==ACC)&&(stack1[sp1]==1))
{
/*歸約A->i:=E*/
gen(":=",sstack[ssp],oth,ibuf[0].pos);
ssp=ssp-3;
sp1=sp1-3;
}
}
/*********************布爾表達(dá)式的分析**************************/
int lrparse2(int num)
{
int templabel;
lr1=action2[stack1[sp1]][change2(g_nExpCurChar.type)];
if (lr1==-1)
{
if (sign==2) printf("\nwhile語句出錯(cuò)!\n");
if (sign==3) printf("\nif語句出錯(cuò)!\n");
getchar();
exit(0);
}
if ((lr1<16)&&(lr1>=0))
{
sp1++;
stack1[sp1]=lr1;
ssp++;
sstack[ssp].type=g_nExpCurChar.type;
sstack[ssp].pos=g_nExpCurChar.pos;
if ((g_nExpCurChar.type!=tempsy)&&(g_nExpCurChar.type!=EA)&&(g_nExpCurChar.type!=EO)) num++;
g_nExpCurChar.type=ibuf[num].type;
g_nExpCurChar.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++;
g_nExpCurChar.type=tempsy;
break;
/*E->i*/
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++;
g_nExpCurChar.type=tempsy;
break;
/*E->i rop i*/
case 103:
label=label-1;
ssp=ssp-3;
sp1=sp1-3;
label++;
g_nExpCurChar.type=tempsy;
break;
/*E->(E)*/
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++;
g_nExpCurChar.type=tempsy;
break;
/*E->not E*/
case 105:
backpatch(ntab2[label-1].tc,nxq);
label=label-1;
ssp=ssp-2;
sp1=sp1-2;
label++;
g_nExpCurChar.type=EA;
break;
/*EA->E(1)and*/
case 106:
label=label-2;
ntab2[label].tc=ntab2[label+1].tc;
ntab2[label].fc=merg(ntab2[label].fc,ntab2[label+1].fc);
ssp=ssp-2;
sp1=sp1-2;
label++;
g_nExpCurChar.type=tempsy;
break;
/*E->EA E(2)*/
case 107:
backpatch(ntab2[label-1].fc,nxq);
label=label-1;
ssp=ssp-2;
sp1=sp1-2;
label++;
g_nExpCurChar.type=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++;
g_nExpCurChar.type=tempsy;
break;
}
lrparse2(num);
}
if (lr1==ACC) return 1;
}
/***************測(cè)試字符是否為表達(dá)式中的值(不包括";")**************/
bool isavalidvalue(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:
////////////////////
case subtract:
case divide:
////////////////////
return true;
default:
return false;
}
}
/*******************************************/
int lrparse()
{
int i1=0;
int num=0;
/*指向表達(dá)式緩沖區(qū)*/
if (isavalidvalue(g_nCurChar.type))
{
if(stack[sp].type==sy_while)
{
sign=2;/*sign=1,表達(dá)式為賦值語句;sign=2,表達(dá)式為布爾表達(dá)式。*/
}
else
{
if (stack[sp].type==sy_if) sign=3;
else sign=1;
}
do
{
ibuf[i1].type=g_nCurChar.type;
ibuf[i1].pos=g_nCurChar.pos;
readnu();
i1++;
}while(isavalidvalue(g_nCurChar.type));
/*把表達(dá)式放入緩沖區(qū)*/
ibuf[i1].type=sharp;
pbuf--;
/*指針后退1,需要嗎?*/
sstack[0].type=sharp;
ssp=0;
/*符號(hào)棧底的初始化*/
if (sign==1)
{
sp1=0;
stack1[sp1]=0;
/*狀態(tài)棧1的棧底初始化*/
num=2;
/*指向:=*/
g_nExpCurChar.type=ibuf[num].type;
g_nExpCurChar.pos=ibuf[num].pos;
lrparse1(num);
/*處理賦值語句*/
g_nCurChar.type=a;
/*當(dāng)前文法符號(hào)置為a(賦值語句)*/
}
if ((sign==2)||(sign==3))
{
pointmark++;
labelmark[pointmark].nxq1=nxq;
sp1=0;
stack1[sp1]=0;
num=0;
g_nExpCurChar.type=ibuf[num].type;
g_nExpCurChar.pos=ibuf[num].pos;
lrparse2(num);
labelmark[pointmark].tc1=ntab2[label-1].tc;
labelmark[pointmark].fc1=ntab2[label-1].fc;
/*處理布爾語句*/
/*在處理完E,要回填真值鏈*/
backpatch(labelmark[pointmark].tc1,nxq);
g_nCurChar.type=e;
/*當(dāng)前文法符號(hào)置為e(賦值語句)*/
}
}
lr=action[stack[sp].pos][g_nCurChar.type];
printf("stack[%d]=%d\t\tn=%d\t\tlr=%d\n",sp,stack[sp].pos,g_nCurChar.type,lr);
if ((lr<19)&&(lr>=0))
{
sp++;
stack[sp].pos=lr;
stack[sp].type=g_nCurChar.type;
readnu();
lrparse();
}
if ((lr<=106)&&(lr>=100))
{
switch (lr)
{
case 100:break;
/*S'->S*/
case 101:
printf("S->if e then S then S else S 歸約\n");
sp=sp-6;
g_nCurChar.type=S;
/*歸約完if后,填then后面的無條件轉(zhuǎn)移語句*/
fexp[labeltemp[pointtemp]].result=nxq;
pointtemp--;
if(stack[sp].type==sy_then)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
pointmark--;
if(stack[sp].type==sy_do)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
break;
/*S->if e then S then S else S*/
case 102:
printf("S->while e do S 歸約\n");
sp=sp-4;
g_nCurChar.type=S;
pointmark--;
if(stack[sp].type==sy_do)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
if(stack[sp].type==sy_then)
{
gen("j",oth,oth,0);
fexp[labelmark[pointmark].fc1].result=nxq;
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
break;
/*S->while e do S*/
case 103:
printf("S->begin L end 歸約\n");
sp=sp-3;
g_nCurChar.type=S;
if(stack[sp].type==sy_then)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
if(stack[sp].type==sy_do)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
break;
/*S->begin L end*/
case 104:
printf("S->a 歸約\n");
sp=sp-1;
g_nCurChar.type=S;
if(stack[sp].type==sy_then)
{
gen("j",oth,oth,0);
backpatch(labelmark[pointmark].fc1,nxq);
pointtemp++;
labeltemp[pointtemp]=nxq-1;
}
if(stack[sp].type==sy_do)
{
gen("j",oth,oth,labelmark[pointmark].nxq1);
backpatch(labelmark[pointmark].fc1,nxq);
}
break;
/*S->a*/
case 105:
printf("歸約\n");
sp=sp-1;
g_nCurChar.type=L;
break;
/*L->S*/
case 106:
printf("L->S;L 歸約\n");
sp=sp-3;
g_nCurChar.type=L;
break;
/*L->S;L*/
}
getchar();
pbuf--;
lrparse();
}
if (lr==ACC) return ACC;
}
/*****************************disp1*************************/
void disptoken()
{
printf("\n********************詞法分析結(jié)果***********************\n");
for(int i=0;i<count;i++)
{
printf("%d\t%d\n",buf[i].type,buf[i].pos);
if (i==20)
{
printf("Press any key to continue......\n");
getchar();
}
}
printf("\n程序總 %d 共行,產(chǎn)生了 %d 個(gè)二元式!\n",lnum,count);
getchar();
}
void dispvarnametable()
{
printf("\n*******************變量表*******************\n");
for(int i=0;i<varnametableptr;i++)
{
printf("%d\t%s\n",i,varnametable[i]);
}
getchar();
}
/******************************************************/
void dispfourexp()
{
int temp1=100;
printf("\n********************四元式分析結(jié)果***********************\n");
for(int i=100;i<nxq;i++)
{
printf("%d\t",i);
printf("(%s\t,",fexp[i].op);
if (fexp[i].arg1.type==ident)
printf("%s\t,",varnametable[fexp[i].arg1.pos]);
else
{
if (fexp[i].arg1.type==tempsy)
printf("T%d\t,",fexp[i].arg1.pos);
else
{
if(fexp[i].arg1.type==intconst)
printf("%d\t,",fexp[i].arg1.pos);
else printf("\t,");
}
}
if (fexp[i].arg2.type==ident)
printf("%s\t,",varnametable[fexp[i].arg2.pos]);
else
{
if (fexp[i].arg2.type==tempsy)
printf("T%d\t,",fexp[i].arg2.pos);
else
{
if(fexp[i].arg2.type==intconst)
printf("%d\t,",fexp[i].arg2.pos);
else printf("\t,");
}
}
if (fexp[i].op[0]!='j')
{
if(fexp[i].result>=100) printf("T%d\t)",fexp[i].result-100);
else printf("%s\t)",varnametable[fexp[i].result]);
}
else printf("%d\t)",fexp[i].result);
if (i==20)
{
printf("\nPress any key to continue......\n");
getchar();
}
printf("\n");
}
getchar();
}
/*****************主程序**********************/
int main(void)
{
if ((cfile=fopen("PAS.dat","r"))==NULL)/*打開c語言源文件*/
{
printf("Open PAS.dat failed!");
return 0;
}
readchar();/*從源文件讀一個(gè)字符*/
scan();/*詞法分析*/
disptoken();
dispvarnametable();
/*初始化狀態(tài)棧棧底*/
stack[sp].pos=0;
stack[sp].type=-1;
/*初始化狀態(tài)棧棧底*/
stack1[sp1]=0;
oth.type=-1;
printf("\n*********狀態(tài)棧變化過程及規(guī)約順序************\n");
readnu();
/*從二元式讀一個(gè)字符*/
lrparse();
getchar();
/*四元式的分析*/
dispfourexp();
fclose(cfile);
printf("The proggy is fucked BY mephisto!!!!");
getchar();
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -