⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycompiler.cpp

📁 类似vc的集成开发环境
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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 + -