📄 mycompiler.cpp
字号:
if(strcmp(i.operation,"lit")==0)
{
if(i.a>=nummax)
{
k=0;
for(j=0;j<numlist0;j++)
if(i.a==numlist[j])
k=1;
if(k==0)
{
numlist[numlist0]=i.a;
numlist0++;
}
}
}
pc++;
}
for(j=0;j<numlist0;j++)
fal<<" num"<<numlist[j]<<"="<<numlist[j]<<";"<<endl;
pc=0;
while(pc<cx)
{
i=code[pc];
m=getopr(i.operation);
switch(m)
{
case 0: //ini
if(i.l==0)
{
fal<<pc<<":"<<endl;
fal<<" push(ra0);"<<endl;
fal<<" pop(rhp);"<<endl;//问题
fal<<" rhp-="<<i.a<<";"<<endl;
fal<<" m(rhp+0)=ra0;"<<endl;
fal<<" push(rhp);"<<endl;
fal<<" pop(ra0);"<<endl;
}
else
{
fal<<pc<<":"<<endl;
fal<<" push(ra1);"<<endl;
fal<<" pop(rhp);"<<endl;//问题
fal<<" rhp-="<<i.a<<";"<<endl;
fal<<" m(rhp+0)=ra1;"<<endl;
fal<<" push(rhp);"<<endl;
fal<<" pop(ra1);"<<endl;
}
break;
case 1: //lit 常量送到运行栈栈顶
rd++;
fal<<pc<<":"<<endl;
if(rd/rc>0)
fal<<" push(rd"<<rd%rc<<");"<<endl;
if(i.a>=nummax)
fal<<" rd"<<rd%rc<<"=num"<<i.a<<";"<<endl;
else
fal<<" rd"<<rd%rc<<"="<<i.a<<";"<<endl;
break;
case 2: //lod
rd++;
fal<<pc<<":"<<endl;
if(rd/rc>0)
fal<<" push(rd"<<rd%rc<<");"<<endl;
if(i.l==0)
fal<<" rd"<<rd%rc<<"=m(ra0+"<<i.a<<");"<<endl;
else
fal<<" rd"<<rd%rc<<"=m(ra1+"<<i.a<<");"<<endl;
break;
case 3: //sto
fal<<pc<<":"<<endl;
if(i.l==0)
fal<<" m(ra0+"<<i.a<<")=rd"<<rd%rc<<";"<<endl;
else
fal<<" m(ra1+"<<i.a<<")=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 4: //substo
fal<<pc<<":"<<endl;
if(i.l==0)
fal<<" m(ra0+"<<i.a<<")=rd3;"<<endl;
else
fal<<" m(ra1+"<<i.a<<")=rd3;"<<endl;
break;
case 5: //subpush
break;
case 6: //subpop
fal<<" pop(rd3);"<<endl;
fal<<" m(ra1+"<<i.a<<")=rd3;"<<endl;
break;
case 7: //jmp
fal<<pc<<":"<<endl;
fal<<" goto("<<i.a<<");"<<endl;
break;
case 8: //sub
fal<<"sub:l"<<pc<<";"<<endl;
break;
case 9: //goto
fal<<pc<<":"<<endl;
fal<<" goto("<<i.a<<");"<<endl;
break;
case 10: //gosub
fal<<pc<<":"<<endl;
fal<<" gosub(l"<<i.a<<");"<<endl;
break;
case 11: //jpc
fal<<pc<<":"<<endl;
fal<<" rd"<<rd%rc<<"--;"<<endl;
fal<<" if(!rzero) goto("<<i.a<<");"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 12: //jfc
fal<<pc<<":"<<endl;
fal<<" rd"<<rd%rc<<"--;"<<endl;
fal<<" if(rzero) goto("<<i.a<<");"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 13: //return
fal<<pc<<":"<<endl;
fal<<" rd"<<i.a<<"=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 14: //main
fal<<"main:"<<endl;
fal<<" rd0=rspstart;"<<endl;
fal<<" rsp=rd0;"<<endl;
fal<<" rd0=rhpstart;"<<endl;
fal<<" push(rd0);"<<endl;
fal<<" pop(rhp);"<<endl;
fal<<" push(rd0);"<<endl;
fal<<" pop(ra1);"<<endl;
fal<<" push(rd0);"<<endl;
fal<<" pop(ra0);"<<endl;
break;
case 15: //reveser
//fal<<pc<<":"<<endl;
//fal<<" push(rd0);"<<endl;
//fal<<" push(rd1);"<<endl;
//fal<<" push(rd2);"<<endl;
k=rd;
rd=-1;
break;
case 16: //opr
fal<<pc<<":"<<endl;
switch(i.a)
{
case 0:fal<<" push(ra1);"<<endl;
fal<<" pop(rhp);"<<endl;
fal<<" ra1=m(rhp+0);"<<endl;
//fal<<" pop(rd2);"<<endl;
//fal<<" pop(rd1);"<<endl;
//fal<<" pop(rd0);"<<endl;
rd=k;
fal<<" return;"<<endl;
break;
case 1:
break;
case 2:fal<<" rd"<<(rd-1)%rc<<"+=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 3:fal<<" rd"<<(rd-1)%rc<<"-=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 4:fal<<" rd"<<(rd-1)%rc<<"*=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 5:fal<<" rd"<<(rd-1)%rc<<"/=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 6:
break;
case 7:
break;
case 8:fal<<" rd"<<(rd-1)%rc<<"-=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
fal<<" if(rzero) rd"<<rd%rc<<"=1;"<<endl;
fal<<" if(!rzero) rd"<<rd%rc<<"=0;"<<endl;
break;
case 9:fal<<" rd"<<(rd-1)%rc<<"-=rd"<<rd%rc<<";"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
fal<<" if(rzero) rd"<<rd%rc<<"=0;"<<endl;
fal<<" if(!rzero) rd"<<rd%rc<<"=1;"<<endl;
break;
case 10:fal<<" rd"<<rd%rc<<"-=rd"<<(rd-1)%rc<<";"<<endl;
newlab();
strcpy(lab0,labcount);
fal<<" if(!rcarry) goto("<<lab0<<");"<<endl;
fal<<" if(rzero) goto("<<lab0<<");"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=1;"<<endl;
fal<<" goto("<<pc+1<<");"<<endl;
fal<<lab0<<":"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=0;"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 11:fal<<" rd"<<rd%rc<<"-=rd"<<(rd-1)%rc<<";"<<endl;
newlab();
strcpy(lab0,labcount);
fal<<" if(!rcarry) goto("<<lab0<<");"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=1;"<<endl;
fal<<" goto("<<pc+1<<");"<<endl;
fal<<lab0<<":"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=0;"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 12:fal<<" rd"<<(rd-1)%rc<<"-=rd"<<rd%rc<<";"<<endl;
newlab();
strcpy(lab0,labcount);
fal<<" if(!rcarry) goto("<<lab0<<");"<<endl;
fal<<" if(rzero) goto("<<lab0<<");"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=1;"<<endl;
fal<<" goto("<<pc+1<<");"<<endl;
fal<<lab0<<":"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=0;"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 13:fal<<" rd"<<(rd-1)%rc<<"-=rd"<<rd%rc<<";"<<endl;
newlab();
strcpy(lab0,labcount);
fal<<" if(!rcarry) goto("<<lab0<<");"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=1;"<<endl;
fal<<" goto("<<pc+1<<");"<<endl;
fal<<lab0<<":"<<endl;
fal<<" rd"<<(rd-1)%rc<<"=0;"<<endl;
if(rd/rc>0)
fal<<" pop(rd"<<rd%rc<<");"<<endl;
rd--;
break;
case 14:
break;
case 15:
break;
case 16:
break;
}
break;
}
pc++;
}
}
int MyCompiler::getopr(char *opr)
{
int k=0;
while((strcmp(opr,operation[k])!=0)&&k<OPRNUM)
k++;
return k;
}
void MyCompiler::enter(char *k)
{
struct param *param1,*param2;
if(i_isarray!=0)
{
if(i_isarray==1)
{
tx++;
i_cultx++;
i_atx++; //数组变量个数
strcpy(IdentTable[tx].name,id);
strcpy(IdentTableFull[i_cultx].name,id);
if(strcmp(k,"long")==0)
{
IdentTable[tx].adr=dx+1;//定义,没有引用
}
else
{
IdentTable[tx].adr=dx;//定义,没有引用
}
IdentTable[tx].val=i_atx;
IdentTable[tx].BackKind=new char[5];
// IdentTable[tx].BackKind=k;
strcpy(IdentTable[tx].BackKind,k);
IdentTable[tx].kind=new char[5];
IdentTable[tx].kind="array";
IdentTable[tx].val=i_atx;
IdentTableFull[i_cultx].val=i_atx;
IdentTableFull[i_cultx].BackKind=new char[5];
// IdentTableFull[i_cultx].BackKind=k;
strcpy(IdentTableFull[tx].BackKind,k);
IdentTableFull[i_cultx].kind=new char[5];
IdentTableFull[i_cultx].kind="array";
ArrayTable[i_atx].count=0;
ArrayTable[i_atx].count++;
ArrayTable[i_atx].elementsize[ArrayTable[i_atx].count]=num;
}
if(i_isarray==2)
{
ArrayTable[i_atx].count++;
ArrayTable[i_atx].elementsize[ArrayTable[i_atx].count]=num;
}
if(i_isarray==3)//数组申明结束前的处理
{
ArrayTable[i_atx].i_startadr=dx;
ArrayTable[i_atx].i_elementindex=0;//定义,没有引用
int i_arraysize=1;
for(int i_acount=1;i_acount<=ArrayTable[i_atx].count;i_acount++)
i_arraysize=i_arraysize*ArrayTable[i_atx].elementsize[ArrayTable[i_atx].count];
if(strcmp(IdentTable[tx].BackKind,"long")==0)
IdentTable[tx].size=2*i_arraysize;
else
IdentTable[tx].size=i_arraysize;
IdentTableFull[i_cultx].size=i_arraysize;
// IdentTable[tx].val=-1;
IdentTable[tx].level=lev;
if(strcmp(IdentTable[tx].BackKind,"long")==0)
dx+=2*i_arraysize;
else
dx+=i_arraysize;
}
return;
}
tx++;
i_cultx++;
strcpy(IdentTable[tx].name,id);
strcpy(IdentTableFull[i_cultx].name,id);
if(strcmp(k,"const")==0)
{
IdentTable[tx].val=num;
IdentTable[tx].kind="const";
IdentTable[tx].BackKind="";
IdentTableFull[i_cultx].kind="const";
IdentTableFull[i_cultx].BackKind="";
getsym();
}
else
{
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
if(in(sym,declbegsys))
{
subparam[subcount].kind=new char[15];
strcpy(subparam[subcount].kind,IdentTable[tx].name);//子函数参数的类型
param2=new param;
param2->kind=new char[5];
strcpy(param2->kind,sym);
param1=param2;
subparam[subcount].p=param2;
subcount++;
getsym();
if(strcmp(sym,"ident")!=0)
error(17);
getsym();
if(strcmp(sym,"comma")==0) //逗号,
{
getsym();
while(in(sym,declbegsys))
{
param2=new param ;
param2->kind=new char[5];
strcpy(param2->kind,sym);
param1->p=param2;
param1=param2;
getsym();
if(strcmp(sym,"ident")!=0)
error(90);
else
getsym();
if(strcmp(sym,"comma")==0)
getsym();
}
}
param1->p=NULL;
}
if(strcmp(sym,"rparen")!=0)
error(18);
getsym();
if(strcmp(sym,"semicolon")!=0)
error(19);
IdentTable[tx].kind="function";
IdentTableFull[i_cultx].kind="function";
IdentTable[tx].BackKind=new char[5];
strcpy(IdentTable[tx].BackKind,k);
IdentTableFull[i_cultx].BackKind=new char[5];
strcpy(IdentTableFull[i_cultx].BackKind,k);
IdentTable[tx].adr=-1;
IdentTable[tx].adrtrue=0;
CMDIFrameWnd * nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
//活动子窗口指针
CMDIChildWnd *nowchild = nowframe->MDIGetActive();
FuncStruct * m_pcurfunc=NULL;
m_pcurfunc=new FuncStruct;
m_pcurfunc->str_funcname=IdentTable[tx].name;
m_pcurfunc->str_functype=k;
m_pcurfunc->n_shengming=line;
m_pcurfunc->n_dingyi=0;
FileList * m_pfile;
m_pfile=new FileList;
m_mappro.Lookup(nowchild->GetSafeHwnd(),(void*&)m_pfile);
m_pfile->oa_funcinfstru.Add((CObject*)m_pcurfunc);
}
else
{
IdentTable[tx].kind=new char[5];
strcpy(IdentTable[tx].kind,k);
IdentTableFull[i_cultx].kind=new char[5];
strcpy(IdentTableFull[i_cultx].kind,k);
IdentTable[tx].BackKind=new char[5];
strcpy(IdentTable[tx].BackKind,k);
IdentTableFull[i_cultx].BackKind=new char[5];
strcpy(IdentTableFull[i_cultx].BackKind,k);
IdentTable[tx].level=lev;
if(strcmp(IdentTable[tx].kind,"long")==0)
{
//long类型变量分配两个存储单元地址分别为:IdentTable[tx].adr,
//IdentTable[tx].adr-1;其中IdentTable[tx].adr-1单元存储高十六位,
//IdentTable[tx].adr单元存储低十六位
IdentTable[tx].size=2;
dx++;
IdentTable[tx].adr=dx;
dx++;
}
else //int ,char 类型,array初始化
{
if(strcmp(IdentTable[tx].kind,"void")==0)
error(98);
IdentTable[tx].size=1;
IdentTable[tx].adr=dx;
dx++;
}
}
}
}
CString MyCompiler::IsVar(CString str_test,CString str_output)
{
if(str_test.GetLength()>15)
return _T("");
char *pText;
pText=(char *)(LPCSTR)str_test;//(LPCSTR)
char ident[15];
// ident=(char[15])*pText;
int i=0;
for(i=0;i<str_test.GetLength();i++)
ident[i]=str_test.GetAt(i);
if(i<15)
for(i=str_test.GetLength();i<15;i++)
ident[i]=NULL;
strcpy(IdentTableFull[0].name,ident);
int j=i_cultx;
while(strcmp(IdentTableFull[j].name,ident)!=0)
j--;
// if(j<i_cultx)
// j++;
char *varkind=NULL;
if(j==0)
str_output=_T("");
else
{
if(FALSE)
{
//CMDIFrameWnd * nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
//CMDIChildWnd *nowchild = nowframe->MDIGetActive();
//CC02IDEView *m_pchildview = (CC02IDEView *)nowchild->GetActiveView();
}
else
{
varkind=IdentTableFull[j].kind;
if(varkind==_T("function")||varkind==_T("array"))
varkind=IdentTableFull[j].BackKind;
// if(!in(varkind,declbegsys))
// if(in(IdentTableFull[j].BackKind,declbegsys))
// varkind=IdentTableFull[j].BackKind;
// strcpy(str_output,IdentTable[0].kind);
if(in(varkind,declbegsys))
{
CString str_temp=_T("");
str_output=varkind;
str_output=str_output+" ";
str_output=str_output+str_test;
if(strcmp(IdentTableFull[j].kind,"array")==0)
{
str_temp.Format("%d",IdentTableFull[j].size);
str_output=str_output+"["+str_temp+"]";
}
}
else
str_output=_T("");
}
}
return str_output;
}
int MyCompiler::GetLineno(int i_code)
{
ASSERT(i_code>=0&&i_code<=CODEMAX);
return code[i_code].sourceline;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -