📄 yy.cpp
字号:
default:
yy_nErrorNum=23;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
NextSym();
if (!s_YuJu()) return FALSE;
//yy
int link=quanjuvalue.nxq;//then 跳转
//yy end
switch (GetCurSym().type)
{
case 10://else
gen("j",0,0,0,0,0,0);
NextSym();
backpatch(FCexit,4,2,quanjuvalue.nxq);//yy
if (!s_YuJu()) return FALSE;
backpatch(link,4,2,quanjuvalue.nxq);//yy
break;
default:
backpatch(FCexit,4,2,quanjuvalue.nxq);//yy
}
return TRUE;
}
int s_XunHuanYuJu()
{
switch (GetCurSym().type)
{
case 11://while
break;
default:
yy_nErrorNum=24;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
NextSym();
int p=quanjuvalue.nxq;//yy//[while后面的表达是所跟的步尔表达是
if (!s_BuErBiaoDaShi()) return FALSE;
//yy
int TCexit=yujuvalue.TC;
int FCexit=yujuvalue.FC;
backpatch(TCexit,4,2,quanjuvalue.nxq);
//yy end
switch (GetCurSym().type)
{
case 12://do
break;
default:
yy_nErrorNum=25;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
NextSym();
if (!s_YuJu()) return FALSE;
//yy
gen("j",0,0,0,0,2,p);
backpatch(FCexit,4,2,quanjuvalue.nxq);
//yy end
return TRUE;
}
int s_BiaoDaShi()
{
int i1,i2,j1,j2,t1,t2,k1,k2,tempi,tempj,tempt,tempk;
if (!s_Xiang()) return FALSE;
//yy
tempi=yujuvalue.Etyp;
tempj=yujuvalue.Evalue;
i1=tempi;j1=tempj;
switch (i1)
{
case 1:
t1=1;k1=j1;break;
case 2:
t1=temptab[j1].typ;
k1=temptab[j1].taddr;
break;
default :
t1=idtab[j1].typ;
k1=idtab[j1].addr;
}
//yy end
while (GetCurSym().type==16)//+
{
NextSym();
if (!s_Xiang()) return FALSE;
//yy
i2=yujuvalue.Etyp;
j2=yujuvalue.Evalue;
switch (i2)
{
case 1:
t2=1;k2=j2;break;
case 2:
t2=temptab[j2].typ;
k2=temptab[j2].taddr;
break;
default :
t2=idtab[j2].typ;
k2=idtab[j2].addr;
}
tempt=(t1>t2)?t1:t2;
tempj=newtemp(tempt);
tempk=temptab[tempj].taddr;
if (i1==1)
if (i2==1)
gen("+I",1,k1,1,k2,3,tempk);
else
if (t2==1)
gen("+I",1,1,i2+1,k2,3,tempk);
else
gen("+R",1,k1,i2+1,k2,3,tempk);
else
if (i2==1)
if (t1==1)
gen("+I",i1+1,k1,1,k2,3,tempk);
else
gen("+R",i1+1,k1,1,k2,3,tempk);
else
if ((t1==1) && (t2==1))
gen("+I",i1+1,k1,i2+1,k2,3,tempk);
else
gen("+R",i1+1,k1,i2+1,k2,3,tempk);
if (i1==2) temptab[j1].used=FALSE;
if (i2==2) temptab[j2].used=FALSE;
tempi=2;
i1=tempi;j1=tempj;t1=tempt;k1=tempk;
//yy end
}
//yy
yujuvalue.Etyp=tempi;
yujuvalue.Evalue=tempj;
//yy end
return TRUE;
}
int s_Xiang()
{
int i1,i2,j1,j2,t1,t2,k1,k2,tempi,tempj,tempt,tempk;
if (!s_YingZi()) return FALSE;
//yy
tempi=yujuvalue.Etyp;
tempj=yujuvalue.Evalue;
i1=tempi;j1=tempj;
switch (i1)
{
case 1:
t1=1;k1=j1;break;
case 2:
t1=temptab[j1].typ;
k1=temptab[j1].taddr;
break;
default :
t1=idtab[j1].typ;
k1=idtab[j1].addr;
}
//yy end
while (GetCurSym().type==18)//*
{
NextSym();
if (!s_YingZi()) return FALSE;
//yy
i2=yujuvalue.Etyp;
j2=yujuvalue.Evalue;
switch (i2)
{
case 1:
t2=1;k2=j2;break;
case 2:
t2=temptab[j2].typ;
k2=temptab[j2].taddr;
break;
default :
t2=idtab[j2].typ;
k2=idtab[j2].addr;
}
tempt=(t1>t2)?t1:t2;
tempj=newtemp(tempt);
tempk=temptab[tempj].taddr;
if (i1==1)
{
if (i2==1)
gen("*I",1,k1,1,k2,3,tempk);
else
{
if (t2==1)
gen("*I",1,k1,i2+1,k2,3,tempk);
else
gen("*R",1,k1,i2+1,k2,3,tempk);
}
}
else
{
if (i2==1)
if (t1==1)
gen("*I",i1+1,k1,1,k2,3,tempk);
else
gen("*R",i1+1,k1,1,k2,3,tempk);
else
if ((t1==1) && (t2==1))
gen("*I",i1+1,k1,i2+1,k2,3,tempk);
else
gen("*R",i1+1,k1,i2+1,k2,3,tempk);
}
if (i1==2) temptab[j1].used=FALSE;
if (i2==2) temptab[j2].used=FALSE;
tempi=2;
i1=tempi;j1=tempj;t1=tempt;k1=tempk;//如果再还有乘号连乘
//yy end
}
//yy
yujuvalue.Etyp=tempi;
yujuvalue.Evalue=tempj;
//yy end
return TRUE;
}
int s_YingZi()
{
int idlevel=quanjuvalue.currbl;//yy
int idpoint;//yy
switch (GetCurSym().type)
{
case 1://id
//yy
idpoint=lookupv_alllevel(GetCurSym().text,idlevel);
switch (idpoint)
{
case -1:
yy_nErrorNum=34;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
case 0:
yy_nErrorNum=33;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
default:
if (idlevel==quanjuvalue.currbl)
if (idtab[idpoint].kind==4) yujuvalue.Etyp=4;
else yujuvalue.Etyp=3;
else yujuvalue.Etyp=idlevel+4;//第i层的变量
yujuvalue.Evalue=idpoint;
}
//yy end
NextSym();
break;
case 2://num
//yy
yujuvalue.Etyp=1;
yujuvalue.Evalue=GetCurSym().value;
//yy end
NextSym();
break;
case 33://(
NextSym();
if (!s_BiaoDaShi()) return FALSE;
switch (GetCurSym().type)
{
case 34://)
break;
default:
yy_nErrorNum=17;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
NextSym();
break;
default:
yy_nErrorNum=28;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
return TRUE;
}
int s_BuErBiaoDaShi()
{
int temp;
int tc,fc;
switch (GetCurSym().type)
{
case 20://~
NextSym();
if (!s_BuErBiaoDaShi()) return FALSE;
//yy
temp=yujuvalue.TC;
yujuvalue.TC=yujuvalue.FC;
yujuvalue.FC=temp;
//yy end
break;
case 33://(
case 1://id
case 2://num
if (!s_GuanXiBiaoDaShi()) return FALSE;
//yy
tc=yujuvalue.TC;
fc=yujuvalue.FC;
//yy end
while (GetCurSym().type==21 || GetCurSym().type==22)
{
if (GetCurSym().type==21)//^
{
NextSym();
backpatch(tc,4,2,quanjuvalue.nxq);//yy
if (!s_BuErBiaoDaShi()) return FALSE;
tc=yujuvalue.TC;//yy
fc=merge(yujuvalue.FC,fc,4);//yy
}
else //|
{
NextSym();
backpatch(fc,4,2,quanjuvalue.nxq);//yy
if (!s_BuErBiaoDaShi()) return FALSE;
fc=yujuvalue.FC;//yy
tc=merge(yujuvalue.TC,tc,4);//yy
}
}
//yy
yujuvalue.TC=tc;
yujuvalue.FC=fc;
//yy end
break;
default:
yy_nErrorNum=29;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
return TRUE;
}
int s_GuanXiBiaoDaShi()
{
int i1,i2,j1,j2,t1,t2,k1,k2,rop;
if (!s_BiaoDaShi()) return FALSE;
//yy
i1=yujuvalue.Etyp;
j1=yujuvalue.Evalue;
switch (i1)
{
case 1:
t1=1,k1=j1;break;
case 2:
t1=temptab[j1].typ;
k1=temptab[j1].taddr;
break;
default:
t1=idtab[j1].typ;
k1=idtab[j1].addr;
}
//yy end
if (!s_GuanXi()) return FALSE;
rop=yujuvalue.Code;//yy
if (!s_BiaoDaShi()) return FALSE;
//yy
i2=yujuvalue.Etyp;
j2=yujuvalue.Evalue;
switch (i2)
{
case 1:
t2=1,k2=j2;break;
case 2:
t2=temptab[j2].typ;
k2=temptab[j2].taddr;
break;
default:
t2=idtab[j2].typ;
k2=idtab[j2].addr;
}
if ((t1!=1) || (t2!=1))//非整数无法比较
{
yy_nErrorNum=39;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
yujuvalue.TC=quanjuvalue.nxq;
if (i1!=1) i1++;
if (i2!=1) i2++;
gen(yy_QuadOpCodeTable[rop],i1,k1,i2,k2,0,0);
yujuvalue.FC=quanjuvalue.nxq;
gen("j",0,0,0,0,0,0);
if (i1==3) temptab[j1].used=FALSE;
if (i2==3) temptab[j2].used=FALSE;
//yy end
return TRUE;
}
int s_GuanXi()
{
switch (GetCurSym().type)
{
case 23://<
case 24://<=
case 25://>
case 26://>=
case 27://=
case 28://<>
break;
default:
yy_nErrorNum=30;
yy_nErrorAddress=yy_pCurSym;
return FALSE;
}
//yy
yujuvalue.Code=GetCurSym().type-11;
//yy end
NextSym();
return TRUE;
}
void coutgen1()
{
for(int i=1;i<quanjuvalue.nxq;i++)
printf("%d,(%d,%d),(%d,%d),(%d,%d)\n",quad[i].op,
quad[i].arg1.fl,quad[i].arg1.flvalue,
quad[i].arg2.fl ,quad[i].arg2.flvalue,
quad[i].result.fl,quad[i].result.flvalue);
};
void coutgen2()
{
for(int i=1;i<quanjuvalue.nxq;i++)
printf("%s,(%d,%d),(%d,%d),(%d,%d)\n",yy_QuadOpCodeTable[quad[i].op],
quad[i].arg1.fl,quad[i].arg1.flvalue,
quad[i].arg2.fl ,quad[i].arg2.flvalue,
quad[i].result.fl,quad[i].result.flvalue);
};
void coutgen()
{
cout<<endl;
for(int i=1;i<quanjuvalue.nxq;i++)
{
cout<<"行号"<<i<<" ";
cout<<"("<<yy_QuadOpCodeTable[quad[i].op]<<", "<<quad[i].arg1.flvalue<<", " <<
quad[i].arg2.flvalue<<", "<<
quad[i].result.flvalue<<")"<<endl;
}
};
void initial()
{
for(int i=0;i<c1.cur_ty;i++)
{
yy_tCifa[i].type=c1.cifaresult[i].type;
strcpy(yy_tCifa[i].text,c1.cifaresult[i].text);
yy_tCifa[i].value=c1.cifaresult[i].value;
yy_tCifa[i].address=c1.cifaresult[i].address;
}
cout<<endl;
cout<<"长度"<<c1.cur_ty<<endl;
//错误和就4员式子操作
strcpy(yy_QuadOpCodeTable[0], "_End_");
strcpy(yy_QuadOpCodeTable[1], "in");
strcpy(yy_QuadOpCodeTable[2], "call");
strcpy(yy_QuadOpCodeTable[3], "out");
strcpy(yy_QuadOpCodeTable[4], "ret");
strcpy(yy_QuadOpCodeTable[5], ":=I");
strcpy(yy_QuadOpCodeTable[6], ":=R");
strcpy(yy_QuadOpCodeTable[7], "par");
strcpy(yy_QuadOpCodeTable[8], "valueI");
strcpy(yy_QuadOpCodeTable[9], "valueR");
strcpy(yy_QuadOpCodeTable[10],"addr");
strcpy(yy_QuadOpCodeTable[11],"j");
strcpy(yy_QuadOpCodeTable[12],"j<");
strcpy(yy_QuadOpCodeTable[13],"j<=");
strcpy(yy_QuadOpCodeTable[14],"j>");
strcpy(yy_QuadOpCodeTable[15],"j>=");
strcpy(yy_QuadOpCodeTable[16],"j=");
strcpy(yy_QuadOpCodeTable[17],"j<>");
strcpy(yy_QuadOpCodeTable[18],"`");
strcpy(yy_QuadOpCodeTable[19],"+I");
strcpy(yy_QuadOpCodeTable[20],"+R");
strcpy(yy_QuadOpCodeTable[21],"*I");
strcpy(yy_QuadOpCodeTable[22],"*R");
strcpy(yy_QuadOpCodeTable[23],"`");
strcpy(yy_QuadOpCodeTable[24],"`");
strcpy(yy_QuadOpCodeTable[25],"`");
strcpy(yy_QuadOpCodeTable[26],"`");
strcpy(yy_QuadOpCodeTable[27],"`");
strcpy(yy_QuadOpCodeTable[28],"`");
strcpy(yy_QuadOpCodeTable[29],"_Erros_");
strcpy(yy_tErrorMessage[0],"正确!");
strcpy(yy_tErrorMessage[2],"非法字符!");
strcpy(yy_tErrorMessage[3],"缺少保留字“ program ”!");
strcpy(yy_tErrorMessage[4],"program 后缺少标识符!");
strcpy(yy_tErrorMessage[5],"缺少“ ; ”符号!");
strcpy(yy_tErrorMessage[6],"缺少程序结束符“ . ”符号!");
strcpy(yy_tErrorMessage[7],"缺少《程序体》,应为 begin,integer,real,procedure");
strcpy(yy_tErrorMessage[8],"缺少保留字“ begin ”!");
strcpy(yy_tErrorMessage[9],"缺少《语句》,应为 begin,ID,if,while,call");
strcpy(yy_tErrorMessage[10],"缺少保留字“ end ”!");
strcpy(yy_tErrorMessage[11],"缺少《说明》,应为 integer,real,procedure");
strcpy(yy_tErrorMessage[12],"缺少保留字 integer 或 real!");
strcpy(yy_tErrorMessage[13],"procedure 后缺少标识符!");
strcpy(yy_tErrorMessage[14],"简单变量说明后缺少标识符!");
strcpy(yy_tErrorMessage[15],"缺少保留字“ procedure ”!");
strcpy(yy_tErrorMessage[16],"缺少 “ ( ”符号!");
strcpy(yy_tErrorMessage[17],"缺少 “ ) ”符号!");
strcpy(yy_tErrorMessage[18],"缺少形参标识符 !");
strcpy(yy_tErrorMessage[19],"缺少 “ : ”符号!");
strcpy(yy_tErrorMessage[20],"缺少标识符!");
strcpy(yy_tErrorMessage[21],"缺少赋值符号“ := ”!");
strcpy(yy_tErrorMessage[22],"缺少保留字“ if ”!");
strcpy(yy_tErrorMessage[23],"缺少保留字“ then ”!");
strcpy(yy_tErrorMessage[24],"缺少保留字“ while ”!");
strcpy(yy_tErrorMessage[25],"缺少保留字“ do ”!");
strcpy(yy_tErrorMessage[27],"缺少被调过程名标识符!");
strcpy(yy_tErrorMessage[28],"缺少《因子》,应为 (,ID,NUMBER");
strcpy(yy_tErrorMessage[29],"缺少《布尔表达式》,应为 ~,(,ID,NUMBER");
strcpy(yy_tErrorMessage[30],"缺少《关系》!");
strcpy(yy_tErrorMessage[31],"变量名不能和过程名相同!");
strcpy(yy_tErrorMessage[32],"标识符重复定义!");
strcpy(yy_tErrorMessage[33],"未定义标识符!");
strcpy(yy_tErrorMessage[34],"不能直接引用过程名!");
strcpy(yy_tErrorMessage[35],"不能从real转换为integer类型!");
strcpy(yy_tErrorMessage[39],"只有integer和integer才能比较!");
strcpy(yy_tErrorMessage[40],"不能这样调用过程!");
strcpy(yy_tErrorMessage[41],"");
strcpy(yy_tErrorMessage[42],"");
strcpy(yy_tErrorMessage[43],"");
};
void reportyuyierror()
{
cout<<endl;
errorvalue.ErrorAddress=yy_nErrorAddress;
errorvalue.ErrorNumber=yy_nErrorNum;
cout<<yy_tErrorMessage[errorvalue.ErrorNumber]<<endl;
cout<<"错误的号为"<<errorvalue.ErrorAddress<<endl;
}
int main()
{
c1.scanner();
initial();
coutty();
if(YuYiFengXi()) coutgen();
else reportyuyierror();
return 0;
}
int merge(int link1, int link2, int p)
{
if (link1==0) return link2;
int a=link1;
int b;
while (1)
{
switch (p)
{
case 2:
b=quad[a].arg1.fl;
break;
case 3:
b=quad[a].arg2.fl;
break;
case 4:
b=quad[a].result.fl;
break;
default:
b=0;
}
if (b==0)
{
switch (p)
{
case 2:
quad[a].arg1.fl=link2;
break;
case 3:
quad[a].arg2.fl=link2;
break;
case 4:
quad[a].result.fl=link2;
break;
default :
;
}
return link1;
}
else
{
a=b;
}
}
}
int newtemp(int t)
{
for (int i=leveltab[quanjuvalue.currbl].temp;i<quanjuvalue.tempp;i++)
if ((temptab[i].used==0) && (temptab[i].typ==t))
{
temptab[i].used=1;
return i;
}
temptab[quanjuvalue.tempp].used=1;
temptab[quanjuvalue.tempp].typ=t;
temptab[quanjuvalue.tempp].taddr=leveltab[quanjuvalue.currbl].recl;
leveltab[quanjuvalue.currbl].recl+=t;
return quanjuvalue.tempp++;
}
void coutty()
{
printf("二元式如下---------------》\n");
int i=0;char b[20];char a[20];
cout.setf(ios::left,ios::adjustfield);
cout.width(15);
cout<<"二元式";
cout.width(15);
cout<<"对应的单词";
cout.width(15);
cout<<"二元式";
cout.width(15);
cout<<"对应的单词";
cout<<endl;
while(i<c1.cur_ty)
{
itoa(yy_tCifa[i].value,b,10);
itoa(yy_tCifa[i].type,a,10);
int blen=strlen(b);
b[blen]=')';
b[blen+1]='\0';
cout<<"("<<a<<",";
cout.width(12);
cout<<b;
cout.width(15);
cout<<yy_tCifa[i].text;
i++;
if(i>=c1.cur_ty) break;
itoa(yy_tCifa[i].value,b,10);
itoa(yy_tCifa[i].type,a,10);
blen=strlen(b);
b[blen]=')';
b[blen+1]='\0';
cout<<"("<<a<<",";
cout.width(12);
cout<<b;
cout.width(15);
cout<<yy_tCifa[i].text;
i++;
cout<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -