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

📄 mycompiler.cpp

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