📄 compiler1.cpp
字号:
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_ChengXuTi()) return FALSE;
//yy
backpatch(link,2,2,leveltab[yuyivar.currbl].recl);
gen("out",0,0,0,0,0,0);
gen("ret",0,0,0,0,0,0);
yuyivar.currbl=leveltab[yuyivar.currbl].outern;
yuyivar.tempp=leveltab[yuyivar.currbl].temp;
//yy end
switch (GetCurSym()->type)
{
case 31://.
break;
default:
m_nErrorNum=6;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case -1://end of cifa
break;
default:
m_nErrorNum=96;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
m_nErrorNum=0;
m_nErrorAddress=m_pCurSym;
return TRUE;
}
int CCompiler::r_ChengXuTi()
{
switch (GetCurSym()->type)
{
case 14://integer
case 15://real
case 5://procedure
if (!r_ShuoMingChuan()) return FALSE;
switch (GetCurSym()->type)
{
case 30://;
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
break;
case 6://begin
break;
default:
m_nErrorNum=7;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
switch (GetCurSym()->type)
{
case 6://begin
break;
default:
m_nErrorNum=8;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_YuJuChuan()) return FALSE;
switch (GetCurSym()->type)
{
case 7://end
break;
default:
m_nErrorNum=10;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
return TRUE;
}
int CCompiler::r_ShuoMingChuan()
{
if (!r_ShuoMing()) return FALSE;
while (GetCurSym()->type==30
&& GetNextSym()->type!=6)//; begin
{
NextSym();
if (!r_ShuoMing()) return FALSE;
}
return TRUE;
}
int CCompiler::r_ShuoMing()
{
switch (GetCurSym()->type)
{
case 14://integer
case 15://real
if (!r_JianBianShuoMing()) return FALSE;
break;
case 5://procedure
if (!r_GuoChengShuoMing()) return FALSE;
break;
default:
m_nErrorNum=11;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
return TRUE;
}
int CCompiler::r_JianBianShuoMing()
{
int typ;//yy
switch (GetCurSym()->type)
{
case 14://integer
typ=1;//yy
break;
case 15://real
typ=2;//yy
break;
default:
m_nErrorNum=12;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=14;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
switch (lookupv(GetCurSym()->text,yuyivar.currbl))
{
case -1:
m_nErrorNum=31;
m_nErrorAddress=m_pCurSym;
return FALSE;
case 0:
addid(GetCurSym()->text,typ,1,leveltab[yuyivar.currbl].recl);
leveltab[yuyivar.currbl].varnum++;
leveltab[yuyivar.currbl].recl+=typ;
break;
default:
m_nErrorNum=32;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy end
NextSym();
while (GetCurSym()->type==32) //,
{
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=14;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
switch (lookupv(GetCurSym()->text,yuyivar.currbl))
{
case -1:
m_nErrorNum=31;
m_nErrorAddress=m_pCurSym;
return FALSE;
case 0:
addid(GetCurSym()->text,typ,1,leveltab[yuyivar.currbl].recl);
leveltab[yuyivar.currbl].varnum++;
leveltab[yuyivar.currbl].recl+=typ;
break;
default:
m_nErrorNum=32;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy end
NextSym();
}
return TRUE;
}
int CCompiler::r_GuoChengShuoMing()
{
switch (GetCurSym()->type)
{
case 5://procedure
break;
default:
m_nErrorNum=15;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=13;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
int link1=yuyivar.nxq;
gen("j",0,0,0,0,0,0);
leveltab[yuyivar.lastbl].lnp=yuyivar.nxq;
leveltab[yuyivar.lastbl].lnum=yuyivar.lastbl;
::strcpy(leveltab[yuyivar.lastbl].name,GetCurSym()->text);
leveltab[yuyivar.lastbl].outern=yuyivar.currbl;
leveltab[yuyivar.lastbl].parnum=0;
leveltab[yuyivar.lastbl].pointer=yuyivar.lasent;
leveltab[yuyivar.lastbl].recl=4;
leveltab[yuyivar.lastbl].temp=yuyivar.tempp;
leveltab[yuyivar.lastbl].varnum=0;
yuyivar.currbl=yuyivar.lastbl;
int v=lookupp(GetCurSym()->text);
yuyivar.lastbl++;
if (v!=-1)
{
m_nErrorNum=32;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
int link2=yuyivar.nxq;
gen("in",0,0,0,0,0,0);
//yy end
NextSym();
switch (GetCurSym()->type)
{
case 33://(
if (!r_XingChanBuFeng()) return FALSE;
break;
default:
;
}
switch (GetCurSym()->type)
{
case 30://;
break;
default:
m_nErrorNum=5;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_ChengXuTi()) return FALSE;
//yy
backpatch(link2,2,2,leveltab[yuyivar.currbl].recl);
gen("out",0,0,0,0,0,0);
gen("ret",0,0,0,0,0,0);
backpatch(link1,4,2,yuyivar.nxq);
yuyivar.currbl=leveltab[yuyivar.currbl].outern;
yuyivar.tempp=leveltab[yuyivar.currbl].temp;
//yy end
return TRUE;
}
int CCompiler::r_XingChanBuFeng()
{
switch (GetCurSym()->type)
{
case 33://(
break;
default:
m_nErrorNum=16;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_XingChan()) return FALSE;
while (GetCurSym()->type==30)
{
NextSym();
if (!r_XingChan()) return FALSE;
}
switch (GetCurSym()->type)
{
case 34://)
break;
default:
m_nErrorNum=17;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
return TRUE;
}
int CCompiler::r_XingChan()
{
int parn;//yy
if (GetCurSym()->type==4)//var
{
NextSym();parn=1;//yy
}
else parn=0;//yy
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=18;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
if (lookupv(GetCurSym()->text,yuyivar.currbl)!=0)
{
m_nErrorNum=32;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
int link=yuyivar.lasent;
addid(GetCurSym()->text,0,3+parn,0);
leveltab[yuyivar.currbl].parnum++;
//yy end
NextSym();
while (GetCurSym()->type==32)//,
{
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=18;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
if (lookupv(GetCurSym()->text,yuyivar.currbl)!=0)
{
m_nErrorNum=32;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
addid(GetCurSym()->text,0,3+parn,0);
leveltab[yuyivar.currbl].parnum++;
//yy end
NextSym();
}
switch (GetCurSym()->type)
{
case 35://:
break;
default:
m_nErrorNum=19;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
int typ;//yy
switch (GetCurSym()->type)
{
case 14://integer
typ=1;//yy
break;
case 15://real
typ=2;//yy
break;
default:
m_nErrorNum=12;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
//yy
for (int i=link;i<yuyivar.lasent;i++)
{
idtab[i].typ=typ;
idtab[i].addr=leveltab[yuyivar.currbl].recl;
leveltab[yuyivar.currbl].recl+=typ;
if (parn) gen("addr",1,i-link+1,0,0,0,0);
else if (typ==1) gen("valueI",1,i-link+1,0,0,0,0);
else gen("valueR",1,i-link+1,0,0,0,0);
}
leveltab[yuyivar.currbl].recl+=leveltab[yuyivar.currbl].lnum;
//yy end
return TRUE;
}
int CCompiler::r_YuJuChuan()
{
if (!r_YuJu()) return FALSE;
while (GetCurSym()->type==30)//;
{
NextSym();
if (!r_YuJu()) return FALSE;
}
return TRUE;
}
int CCompiler::r_YuJu()
{
switch (GetCurSym()->type)
{
case 6://begin
if (!r_FuHeYuJu()) return FALSE;
break;
case 1://id
if (!r_FuZhiYuJu()) return FALSE;
break;
case 8://if
if (!r_TiaoJianYuJu()) return FALSE;
break;
case 11://while
if (!r_XunHuanYuJu()) return FALSE;
break;
case 13://call
if (!r_GuoChengYuJu()) return FALSE;
break;
default:
m_nErrorNum=9;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
return TRUE;
}
int CCompiler::r_FuHeYuJu()
{
switch (GetCurSym()->type)
{
case 6://begin
break;
default:
m_nErrorNum=8;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_YuJuChuan()) return FALSE;
switch (GetCurSym()->type)
{
case 7://end
break;
default:
m_nErrorNum=10;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
return TRUE;
}
int CCompiler::r_FuZhiYuJu()
{
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=20;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
//yy
int idlevel=yuyivar.currbl;
int idpoint=lookupv2(GetCurSym()->text,idlevel);
if (idpoint==0)
{
m_nErrorNum=33;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
if (idpoint==-1)
{
m_nErrorNum=34;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
int t1=idtab[idpoint].typ;
int k1=idtab[idpoint].addr;
int i1;
if (idlevel==yuyivar.currbl)
{
if (idtab[idpoint].kind==4) i1=5;
else i1=4;
}
else
{
i1=idlevel+6;
}
//yy end
NextSym();
switch (GetCurSym()->type)
{
case 29://:=
break;
default:
m_nErrorNum=21;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_BiaoDaShi()) return FALSE;
//yy
int t2;
int k2;
int i2=yuyivalue.Etyp;
int j2=yuyivalue.Evalue;
if (i2==1)
{
k2=j2;
t2=1;
}
else if (i2==2)
{
k2=temptab[j2].taddr;
t2=temptab[j2].typ;
i2=3;
}
else
{
k2=idtab[j2].addr;
t2=idtab[j2].typ;
i2+=1;
}
if (t1<t2)
{
m_nErrorNum=35;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
if (t1==1) gen(":=I",i1,k1,i2,k2,0,0);
else gen(":=R",i1,k1,i2,k2,0,0);
if (i2==3) temptab[j2].used=FALSE;
//yy end
return TRUE;
}
int CCompiler::r_TiaoJianYuJu()
{
switch (GetCurSym()->type)
{
case 8://if
break;
default:
m_nErrorNum=22;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_BuErBiaoDaShi()) return FALSE;
//yy
int TCexit=yuyivalue.TC;
int FCexit=yuyivalue.FC;
backpatch(TCexit,4,2,yuyivar.nxq);
//yy end
switch (GetCurSym()->type)
{
case 9://then
break;
default:
m_nErrorNum=23;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_YuJu()) return FALSE;
//yy
int link=yuyivar.nxq;
gen("j",0,0,0,0,0,0);
//yy end
switch (GetCurSym()->type)
{
case 10://else
NextSym();
backpatch(FCexit,4,2,yuyivar.nxq);//yy
if (!r_YuJu()) return FALSE;
break;
default:
backpatch(FCexit,4,2,yuyivar.nxq);//yy
}
backpatch(link,4,2,yuyivar.nxq);//yy
return TRUE;
}
int CCompiler::r_XunHuanYuJu()
{
switch (GetCurSym()->type)
{
case 11://while
break;
default:
m_nErrorNum=24;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
int p=yuyivar.nxq;//yy
if (!r_BuErBiaoDaShi()) return FALSE;
//yy
int TCexit=yuyivalue.TC;
int FCexit=yuyivalue.FC;
backpatch(TCexit,4,2,yuyivar.nxq);
//yy end
switch (GetCurSym()->type)
{
case 12://do
break;
default:
m_nErrorNum=25;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
if (!r_YuJu()) return FALSE;
//yy
gen("j",0,0,0,0,2,p);
backpatch(FCexit,4,2,yuyivar.nxq);
//yy end
return TRUE;
}
int CCompiler::r_GuoChengYuJu()
{
switch (GetCurSym()->type)
{
case 13://call
break;
default:
m_nErrorNum=26;
m_nErrorAddress=m_pCurSym;
return FALSE;
}
NextSym();
switch (GetCurSym()->type)
{
case 1://id
break;
default:
m_nErrorNum=27;
m_nErrorAddress=m_pCurSym;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -