📄 mycompiler.cpp
字号:
{
//factor_type=4;
gen("lodex",0,1,line); //lod long to top
}
else //int,char array
{
//factor_type=0;
gen("lodex",0,0,line); //int int ,char to top
}
}
else
if(strcmp(IdentTable[j].kind,"const")==0)
{
if(strcmp(param1->kind,"long")==0)
{
gen("lit",0,0,line);
}
gen("lit",0,IdentTable[j].val,line);
}
else
{
if(strcmp(param1->kind,IdentTable[j].kind)!=0)
{
error(55);
}
else
{
if(strcmp(param1->kind,"long")==0)
{
gen("subpush",IdentTable[j].level,IdentTable[j].adr-1,line);
}
gen("subpush",IdentTable[j].level,IdentTable[j].adr,line);
}
}
}
}
getsym();
if(strcmp(sym,"comma")==0) //逗号,
getsym();
param1=param1->p;
}
if(param1!=NULL)
{
error(99);
}
else
if(strcmp(sym,"rparen")!=0)
{
error(98);
while(strcmp(sym,"rparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
}
else//子函数没有参数
{
getsym();
if(strcmp(sym,"rparen")!=0) //)
{
error(24);
while(strcmp(sym,"rparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
}
return 0;
}
void MyCompiler::maindispose(MyCompiler::node *fsys)
{
int tx0;//记录全局变量登陆表格的单元数
int funtionstart;//记录该函数的开始指令地址
tx0=tx;
lev=1;
// sub_type=-1;
funtionstart=cx;
if(strcmp(sym,"main")==0)
{
getsym();
}
else
{
error(4);
while(strcmp(sym,"over")!=0&&strcmp(sym,"main")!=0&&strcmp(sym,"const")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
gen("main",0,0,line);
gen("ini",0,dx,line);
int varnumber=0;
for(int zzz=1;zzz<=tx0;zzz++)
{
if(strcmp(IdentTable[zzz].kind,"function")!=0)
if(strcmp(IdentTable[zzz].kind,"const")!=0)
varnumber++;
}
fvar<<varnumber<<endl;
for(zzz=1;zzz<=tx0;zzz++)
if(strcmp(IdentTable[zzz].kind,"function")!=0)
if(strcmp(IdentTable[zzz].kind,"const")!=0)
fvar<<IdentTable[zzz].name<<" "<<IdentTable[zzz].size<<" "<<IdentTable[zzz].adr<<endl;
dx=1;
if(strcmp(sym,"lparen")==0)
{
getsym();
}
else
{
error(13);
while(strcmp(sym,"over")!=0&&strcmp(sym,"const")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
if(strcmp(sym,"rparen")==0)
{
getsym();
}
else
{
error(13);
while(strcmp(sym,"over")!=0&&strcmp(sym,"const")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
if(strcmp(sym,"lbigparen")!=0)
{
error(4);
do{
getsym();
}while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0);
}
if(strcmp(sym,"lbigparen")==0)
{
getsym();
while(in(sym,declbegsys)) //变量申明开始符号集
{
char type[5];
strcpy(type,sym);
getsym(); //变量名
vardeclaration(type);
while(strcmp(sym,"comma")==0) //逗号","
{
getsym();
vardeclaration(type);
}
if(strcmp(sym,"semicolon")==0) //分号";"
{
getsym();
}
else
{
error(4);
while(strcmp(sym,"over")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
}
gen("ini",1,dx,line);
while(in(sym,statbegsys)==1)
{
statement(fsys);
if(strcmp(sym,"semicolon")==0)
getsym();
else
{
error(12);
while(strcmp(sym,"over")!=0&&in(sym,statbegsys)==0&&strcmp(sym,"rbigparen")!=0)
getsym();
}
}
if(strcmp(sym,"rbigparen")!=0)
{
error(15);
while(strcmp(sym,"over")!=0&&strcmp(sym,"rbigparen")!=0)
getsym();
}
}
gen("jmp",0,cx,line);
lev=0;
fvar<<tx-tx0<<" "<<funtionstart<<" "<<cx-1<<endl;
for(int z=tx0+1;z<=tx;z++)
fvar<<IdentTable[z].name<<" "<<IdentTable[z].size<<" "<<IdentTable[z].adr<<endl;
for(z=tx0+1;z<tx;z++)
{
// if(strcmp(IdentTable[z].kind,"function")==0)
// delete IdentTable[z].BackKind;
// delete IdentTable[z].kind;//??
}
tx=tx0;
}
void MyCompiler::subdispose(MyCompiler::node *fsys)
{
int i,k,j,paramcount=0,m=0;
int tx0,funtionstart;
struct param *param1;
if(strcmp(sym,"over")!=0)
{
char type[5];
char FunctionType[5];
int IsFunctionType=0;
tx0=tx;
dx=1;
lev=1;
funtionstart=cx;
if(in(sym,declbegsys))
{
IsFunctionType=1;
strcpy(FunctionType,sym);
getsym();
}
if(strcmp(sym,"ident")!=0)
{
error(16);
while(strcmp(sym,"ident")!=0&&strcmp(sym,"over")!=0)
getsym();
}
i=position(id);
if(i==0)
{
error(20);
while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
else
{
CMDIFrameWnd * nowframe = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;
//活动子窗口指针
CMDIChildWnd *nowchild = nowframe->MDIGetActive();
FuncStruct * m_pcurfunc=NULL;
FileList * m_pfile;
m_pfile=new FileList;
m_mappro.Lookup(nowchild->GetSafeHwnd(),(void*&)m_pfile);
m_pcurfunc=new FuncStruct;
int i_fun=0;
i_fun=m_pfile->oa_funcinfstru.GetSize();
for(int j=0;j<i_fun;j++)
{
m_pcurfunc=(FuncStruct*)m_pfile->oa_funcinfstru.GetAt(j);
if(id==m_pcurfunc->str_funcname)
break;
}
m_pcurfunc->n_dingyi=line;
m_pfile->oa_funcinfstru.SetAt(j,(CObject*)m_pcurfunc);
if(IsFunctionType==1)
{
if(strcmp(IdentTable[i].BackKind,FunctionType)!=0)
error(21);
}
// if(strcmp(IdentTable[i].BackKind,"int")==0)
// {
// sub_type=1;
// }
// else
// {
// if(strcmp(IdentTable[i].BackKind,"long")==0)
// sub_type=4;
// else
// sub_type=-1;
// }
while((m<subcount)&&(strcmp(subparam[m].kind,id)!=0))
m++;
k=IdentTable[i].adr;
IdentTable[i].adr=cx;
if(k>-1)
{
while(code[k].a>-1)
{
j=code[k].a;
code[k].a=cx;
k=j;
}
code[k].a=cx;
}
IdentTable[i].adrtrue=1;
gen("sub",0,cx,line);
getsym();
if(strcmp(sym,"lparen")==0)
{
getsym();
}
else
{
error(23);
while(strcmp(sym,"rparen")!=0&&strcmp(sym,"over")!=0&&strcmp(sym,"lbigparen")!=0)
getsym();
}
if(in(sym,declbegsys)==1)//参数类型
{
if(subcount>m)//函数参数存在
{
param1=subparam[m].p;
if(strcmp(param1->kind,id)==0)//
{
//getsym(); //ident
enter(param1->kind);
if(strcmp(param1->kind,"long")==0)
paramcount++;
paramcount++;
param1=param1->p;
getsym();
}
else
error(28);
if(strcmp(sym,"comma")==0) //,
getsym();
while((strcmp(sym,"rparen")!=0)&&(param1!=NULL))
{
if(strcmp(param1->kind,sym)==0)
{
getsym();
enter(param1->kind);
if(strcmp(param1->kind,"long")==0)
paramcount++;
paramcount++;
getsym();
}
if(strcmp(sym,"comma")==0)
getsym();
param1=param1->p;
}
if(param1!=NULL)
error(31);
if(strcmp(sym,"rparen")!=0)
{
error(32);
while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
else
{
getsym();
}
}
else
{
error(24);
while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
}
else//左括号后不是数据类型
{
if(strcmp(sym,"rparen")==0)//左括号后不是右括号
{
getsym();
}
else
{
error(24);
while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
}
}
if(strcmp(sym,"lbigparen")!=0)//
{
error(4);
while(strcmp(sym,"lbigparen")!=0&&strcmp(sym,"over")!=0)
getsym();
}
if(strcmp(sym,"lbigparen")==0)//大括号{
{
getsym();
while(in(sym,declbegsys))
{
strcpy(type,sym);
getsym();
vardeclaration(type);
while(strcmp(sym,"comma")==0)
{
getsym();
vardeclaration(type);
}
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(4);
while(strcmp(sym,"over")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
}
gen("ini",1,dx,line);
while(paramcount>0)
{
gen("subpop",1,paramcount,line);
paramcount--;
}
gen("resever",0,0,line);
while(in(sym,statbegsys)==1)
{
statement(fsys);
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(6);
while(strcmp(sym,"over")!=0&&in(sym,statbegsys)==0&&strcmp(sym,"rbigparen")!=0)
getsym();
}
}
if(strcmp(sym,"rbigparen")!=0)
{
error(15);
while(strcmp(sym,"over")!=0&&strcmp(sym,"rbigparen")!=0)
getsym();
}
}
if(strcmp(sym,"rbigparen")==0)
gen("opr",0,0,line);
fvar<<tx-tx0<<" "<<funtionstart<<" "<<cx<<endl;
for(int z=tx0+1;z<=tx;z++)
fvar<<IdentTable[z].name<<" "<<IdentTable[z].size<<" "<<IdentTable[z].adr<<endl;
for(int zz=tx0+1;zz<=tx;zz++)
{
delete IdentTable[zz].kind;
}
tx=tx0;
lev=0;
getsym();
subdispose(fsys);
}
}
void MyCompiler::Compile_C02(CString str_file)
{
Init();
str_filepath=str_file;
char type[5];
getsym();
if(strcmp(sym,"over")==0)
{
return;
}
while(strcmp(sym,"const")==0)
{
getsym();
constdeclaration();
if(strcmp(sym,"semicolon")!=0)
{
error(4);
while(strcmp(sym,"over")!=0&&strcmp(sym,"main")!=0&&strcmp(sym,"const")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
else
{
getsym();
}
}
while(in(sym,declbegsys))
{
strcpy(type,sym);
getsym();
vardeclaration(type);
while(strcmp(sym,"comma")==0)
{
getsym();
vardeclaration(type);
}
if(strcmp(sym,"semicolon")==0)
{
getsym();
}
else
{
error(4);
while(strcmp(sym,"over")!=0&&strcmp(sym,"main")!=0&&in(sym,declbegsys)==0&&in(sym,statbegsys)==0)
getsym();
}
}
maindispose(tempsetsys);//语句结束符“;”
getsym();
subdispose(tempsetsys);//语句结束符";"
for(int x=0;x<cx;x++)
{
fout<<x<<": "<<code[x].sourceline+1<<" "<<code[x].operation<<" "<<code[x].l<<" "<<code[x].a<<endl;
}
interpret();
}
//
void MyCompiler::interpret()
{
struct instruction i;
int rd=-1,k,j,m;
int pc=0;
const rc=4; //所用数据寄存器个数
const nummax=128; //立即数的最大值
char lab0[4];
int numlist[1000];
int numlist0=0;
fal<<"macro:"<<endl;
fal<<" rspstart=0x0000;"<<endl;
fal<<" rhpstartaddr=0x0070;"<<endl;
fal<<"const:"<<endl;
fal<<" rhpstart=rhpstartaddr;"<<endl;
pc=0;
while(pc<cx)
{
i=code[pc];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -