ccompile.cpp

来自「c 语言写的C语言编译器,使用vc++6.0」· C++ 代码 · 共 1,651 行 · 第 1/2 页

CPP
1,651
字号
		if(!strcmp(symch,"}"))
		{
			error(4);
		}
	}
}
void SemiSeries()//语句序列
{
	if(sort==0 || sort==2 || !(strcmp(symch,"{")))
	{
		Semi();
							/*
								if(!strcpy(symch,";"))
								{
									GetSymbol();
									SemiSeries1();
								}
								else
								{
									
									error(6);
									SemiSeries1();
								}
							*/
		SemiSeries();
	}

}
void SemiSeries1()//语句序列1
{	
	
//	if(!strcmp(symch,";"))
//	{
		Semi();
//		GetSymbol();
//	}
}
void AssignSemi()//赋值语句
{
	if(sort==2)
	{
		GetSymbol();
		if(!strcmp(symch,"="))
		{
			GetSymbol();
			Express();
		}
	}
}
void Condition()//条件
{
	cout<<"deal condition!"<<endl;
	Express();
	if(!strcmp(symch,"<") || !strcmp(symch,"<=") || !strcmp(symch,">") || !strcmp(symch,">=") || !strcmp(symch,"==") || !strcmp(symch,"!=") )
	{
		cout<<"deal the symbol"<<endl;
		GetSymbol();
		cout<<"deal express"<<endl;
		Express();
	}
	else
	{
		error(10);
	}
}
void Express()//表达式
{
	cout<<"now deal express"<<endl;///////////////////////////////////////////
	Trade();
	Express1();
}
void Express1()
{
	if(!strcmp(symch,"+") ||!strcmp(symch,"-"))
	{
		GetSymbol();
		Trade();
		Express1();
	}
}
void Trade()
{
	Factor();
	Trade1();
}
void Trade1()
{
	if(!strcmp(symch,"*") || !strcmp(symch,"/"))
	{
		GetSymbol();
		Factor();
		Trade1();
	}
}
void Factor()
{
	if(sort==2)
	{
		GetSymbol();
	}
	else if(sort==3)
	{
		GetSymbol();
	}
	else
	{
		Express();
	}
}
void ConditionSemi()//条件语句
{
	if(!strcmp(symch,"if"))
	{
		cout<<"now start anaysics if sentence!"<<endl;
		GetSymbol();
		if(!strcmp(symch,"("))
		{
			GetSymbol();
			Condition();
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				//cout<<"in deal else"<<endl;
				if(!strcmp(symch,"{"))
					ComplexSemi();
				else
					Semi();
				if(!strcmp(symch,"else"))
				{
					GetSymbol();
					if(!strcmp(symch,"{"))
						ComplexSemi();
					else
						Semi();
				}
				else
				{
					error(11);
					Semi();
				}
			}
			else
			{
				error(12);
				Semi();
				if(!strcmp(symch,"else"))
				{
					GetSymbol();
					Semi();
				}
				else
				{
					error(11);
					Semi();
				}
				
			}
		}
		else
		{
			error(13);
			Express();
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				Semi();
				if(!strcmp(symch,"else"))
				{
					GetSymbol();
					Semi();
				}
				else
				{
					error(11);
					Semi();
				}
			}
			else
			{
				error(12);
				Semi();
				if(!strcmp(symch,"else"))
				{
					GetSymbol();
					Semi();
				}
				else
				{
					error(11);
					Semi();
				}
				
			}
		}
	}
}
void LoopSemi()//循环语句
{
	if(!strcmp(symch,"while"))
	{
		GetSymbol();
		if(!strcmp(symch,"("))
		{	
			GetSymbol();
			Condition();
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				Semi();
			}
			else
			{
				error(12);
				Semi();
			}
		}
		else
		{
			error(13);
			Condition();
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				Semi();
			}
			else
			{
				error(12);
				Semi();
			}

		}
	}
}
//************************************************the init word for grammer anaysics ***********************************/


/*CodeList* initCode(int calLen,int Lfirst,int Lsecond,int Ldest)//init the code struct 
{
	cout<<"start init the code space!"<<endl;
	CodeList celement;
	celement.cal=new char[calLen];
	celement.first=new char[Lfirst];
	celement.second=new char[Lsecond];
	celement.destination=new char[Ldest];
	celement.next=NULL;
	return &celement;
}*/


int crC=0;
CodeList *pCL=new CodeList;
int genCode(char *cal,char *first,char *second,char *destination)//4元式生成函数
{
	cout<<"start  generator code!"<<endl;
	if(!cal||!first||!second||!destination)
	{
		cout<<"error happen at the gencode!"<<endl;
		return 1;
	}
	CodeList *ce=new CodeList();
	ce->cal=new char[strlen(cal)];
	ce->first=new char[strlen(first)];
	ce->second=new char[strlen(second)];
	ce->destination=new char[strlen(destination)];
	strcpy(ce->cal,cal);
	strcpy(ce->first,first);
	strcpy(ce->second,second);
	ce->destination=destination;
	if(!head)
	{
		pCL=ce;
		head=ce;
		ce->next=NULL;
	}
	else{
		pCL->next=ce;
		pCL=ce;
		ce->next=NULL;
	}
	//	ce->next=head;
	//	head=ce;
//	cout<<"cout head current address is "<<head<<endl;
		int r=crC;
		crC++;
		cout<<"get a code"<<endl;
		cout<<crC<<" "<<ce->cal<<" "<<ce->first<<" "<<ce->second<<" "<<ce->destination<<endl;
		PreCodeLine=r;
		NextCodeLine=r+1;
		cout<<"the Next Line "<<NextCodeLine <<endl;
		return r;
}
int otCode()//out code to CodeFinal.txt
{
	crC=0;
	ofstream fos;
	fos.open("CodeFinal.txt");
	CodeList *pCL=head;
	cout<<"the code start out put "<<endl;
	if(!pCL)return NULL;
	while(pCL)
	{
		fos<<crC<<":"<<" "<<pCL->cal<<" "<<pCL->first<<" "<<pCL->second<<" "<<pCL->destination<<endl;
		cout<<crC<<" "<<pCL->cal<<" "<<pCL->first<<" "<<pCL->second<<" "<<pCL->destination<<endl;
		if(!pCL->next)break;
		pCL=pCL->next;
		crC++;
	}
	cout<<"the code is output int the CodeFinal.txt"<<endl;
	return 1;
}
int findUsr(char *name) //查找用户标示符是否存在
{
	cout<<"start to find the user declare"<<endl;
	for(int i=0;i<LINENUM;i++)
	{
		if(strcpy(usr[i],name))
		{
			return 1;//find the usr ;
		}
	}
	return -1;//not find the usr defination
}
int cU=0;
int cN=0;
char *getNextUsr()//下一个用户自定义标示符
{
	 char *p=usr[cU];
	 cU++;
	 return p;
}

char *getNextNum()//下一个数字
{
	int p=cN;
	cN++;
	return num[p];
}
int rT=0;
char temp[3];
char *genTemp()//产生临时变量
{
	temp[0]='T';
	temp[1]='\0';
	char *p=changeNumToString(rT);
	cout<<"the radio number is  "<<p<<endl;
	rT++;
	strcat(temp,p);
	return temp;
}

char *pAd;//记录当前需代填的地址
TrueList *pT;//当前的代填跳转地址栈的末尾
char* getTrue()//将代填的跳转号压入栈 
{
	TrueList *tL=new TrueList;
	if(!TrueHead)
	{
	TrueHead=tL;
	pT=tL;
	}
	else{
	pT->next=tL;
	pT=tL;
	}
	tL->next=NULL;
	tL->codeElement=new char[3];
	pAd=tL->codeElement;//全局变量记录
	return tL->codeElement;//返回当前代填的地址空间
}
char *deleteTrue(char * pC)//将队列头给4元式的待填语句
{
	cout<<"the destination is address is"<<pC<<endl;
	if(!TrueHead)return NULL;
	if(TrueHead)
	{
		strcpy(TrueHead->codeElement,pC);
		cout<<"TrueHead->codeElement  "<<TrueHead->codeElement<<endl;
		if(!TrueHead->next)return NULL;
		TrueHead=TrueHead->next;
	}
	return NULL;
}
char * changeNumToString(int number)//将数字转化为符号串
{
	char buffer[1000];
	ostrstream sout(buffer,sizeof(buffer));
	sout<<number<<'\0';
	char *p=sout.str();
	cout<<"the number to String is  "<<p<<endl;
	return p;
}
/***********************the end of init***************************/
char * genExpress1(char*);
void Generate()
{
	system("type code.txt");
	clear();
	GetSymbol();
	genProgram();
}
void genProgram()
{
	if(!strcmp(symch,"main"))
	{
		GetSymbol();
		if(!strcmp(symch,"("))
		{
			GetSymbol();
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				if(!strcmp(symch,"{"))
				{
					GetSymbol();
					genProPart();// child program part 
					if(!strcmp(symch,"}"))
					{
						GetSymbol();
					}
					else
					{
						error(4);
					}
				}
				else
				{
					error(3);
				}
			}
			else
			{
				error(12);
			}

		}
		else
		{
			error(13);
		}
	
	}
	else
	{
		error(5);
	}
}

void genProPart()
{
	ConstDec();//const declare
	VarDecPart();//val declare
	if(!strcmp(symch,";"))
	{
		GetSymbol();
		genSemiPart();//sentence part
	}
	else
	{	
		error(6);
	}
}
void genConstDec()
{
	if(!strcmp(symch,"const"))
	{
		GetSymbol();
		genConstDef();
		if(!strcmp(symch,";"))
		{
			GetSymbol();
		}
		else
		{
			error(6);
		}
	}
}
void genIdent()
{
	if(sort==usrsym)
	{
		GetSymbol();
	}
	else 
	{
		error(2);
	}
}
void genConstDef()
{
	Ident();
	if(!strcmp(symch,"="))
	{
		GetSymbol();
		if(sort==3)
		{

			GetSymbol();
		}
		else
		{
			error(7);
		}
	}
	else
	{
		GetSymbol();
		error(8);
	}

}
void genVarDecPart()//变量说明部分
{
	genVarDec();
	genIdentTab();//anaysics the identity table
}
void genVarDec()//judge if int 
{
	if(!strcmp(symch,"int"))
	{
		GetSymbol();
	}
	else
	{
		error(9);
	}
}
void genIdentTab()
{
	genIdent();//judge if the identity 
	genIdentTab1();
}
void genIdentTab1()
{
	if(!strcmp(symch,","))
	{
		GetSymbol();
		genIdent();
		genIdentTab1();
	}
}
void genSemiPart()//语句部分
{
	if(!strcmp(symch,"{"))
	{
		genComplexSemi();//deal complex 
	}
	else
		genSemiSeries();//deal series sentence
}

void genSemi()//语句
{
//	cout<<"else"<<endl;
	if(sort==2)
	{
		genAssignSemi();//deal assignment sentence 
		if(!strcmp(symch,";"))
		{
			GetSymbol();
		}
		else
		{
			error(6);
		}
	}
	else if(!strcmp(symch,"if"))
	{
		genConditionSemi();
	}
	else if(!strcmp(symch,"while"))
	{
		genLoopSemi();
	}
	else
		genComplexSemi();
}
void genComplexSemi()//复合语句
{
	if(!strcmp(symch,"{"))
	{	
		GetSymbol();
		genSemiSeries();
		if(!strcmp(symch,"}"))
		{
			GetSymbol();
		}
		else
			error(4);
	}
	else 
	{
		error(3);

	}
}
void genSemiSeries()//语句序列
{
	if(sort==0 || sort==2 || !(strcmp(symch,"{")))
	{
		genSemi();
		genSemiSeries();
	}

}
void genSemiSeries1()//语句序列1
{	
	
//	if(!strcmp(symch,";"))
//	{
		genSemi();
//		GetSymbol();
//	}
}
void genAssignSemi()//赋值语句
{
	cout<<"NOW DEAL ASSIGNMENT"<<endl;
	if(sort==2)
	{
		char *pU=getNextUsr();//the previous usr defination symbol
		if(findUsr(pU)==-1)
		{
			cout<<"had no definition of user"<<endl;
			return;
			error(2);
		}
		GetSymbol();
		if(!strcmp(symch,"="))
		{
			cout<<"symbol is "<<symch<<endl;
			GetSymbol();
			char *pV=genExpress();
			if(!pV){
				cout<<"error at genExpress()"<<endl;	
			}
			cout<<"get a asignment sentence"<<endl;
			genCode("=",pV,"-",pU);
		}
	}
}
char* genCondition()//条件
{
	cout<<"deal condition!"<<endl;
	char *p1=genExpress();//get the val of expless 
	if(!strcmp(symch,"<") || !strcmp(symch,"<=") || !strcmp(symch,">") || !strcmp(symch,">=") || !strcmp(symch,"==") || !strcmp(symch,"!=") )
	{
		char cp[3];
		strcpy(cp,symch);
		cout<<"deal the symbol"<<endl;
		GetSymbol();
		cout<<"deal express"<<endl;
		char *p2=genExpress();
		char *temp=genTemp();
		getTrue();
		genCode(cp,p1,p2,pAd);
		genCode(":=","0","-",temp);
		getTrue();
		genCode("GOTO","-","-",pAd);
		int cA=genCode(":=","1","-",temp);//the address of current address
		deleteTrue(changeNumToString(cA));
		return temp;
	}
	else
	{
		error(10);
		return NULL;
	}
}
char* genExpress()//表达式
{
	cout<<"now deal express"<<endl;///////////////////////////////////////////
	char *pT=genTrade();
	return genExpress1(pT);
}

char* genExpress1(char *pT0)
{
	cout<<"the genexpress1 is "<<pT0<<endl;
	if(!pT0)return NULL;
	if(!strcmp(symch,"+") ||!strcmp(symch,"-"))
	{
		char cal[2];
		strcpy(cal,symch);
		cout<<"the previous char"<<cal<<endl;
		cout<<"now deal the add calulate"<<endl;
		GetSymbol();
		char *pT=genTrade();
		char *temp=genTemp();
		genCode(cal,pT0,pT,temp);
		return genExpress1(temp);
	}
	return pT0;
}
char *genTrade1(char*);
char* genTrade()
{
	char *pF=genFactor();
	return genTrade1(pF);
}
char* genTrade1(char *pF0)
{
	if(!pF0)return NULL;
	if(!strcmp(symch,"*") || !strcmp(symch,"/"))
	{
		char cal[2];
		strcpy(cal,symch);
		GetSymbol();
		char *pF=genFactor();
		if(!pF)return NULL;
		char *temp=genTemp();
		genCode(cal,pF0,pF,temp);
		return genTrade1(temp);
	}
	return pF0;
}
char* genFactor()
{
	if(sort==2)
	{
		char *pU=getNextUsr();
		if(!pU)return NULL;
		if(findUsr(pU)==-1)
		{
			cout<<"had not find usr defintion "<<endl;
			error(2);
		}
		GetSymbol();
		return pU;
	}
	else if(sort==3)
	{
		char *pN=getNextNum();
		GetSymbol();
		return pN;
	}
	else
	{
		return genExpress();
	}
}

void genConditionSemi()//条件语句
{
	if(!strcmp(symch,"if"))
	{
		cout<<"now start anaysics if sentence!"<<endl;
		GetSymbol();
		if(!strcmp(symch,"("))
		{
			GetSymbol();
			char *temp=genCondition();
			getTrue();
			int c=genCode("!=",temp,"1",pAd);
			deleteTrue(changeNumToString(c));
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				cout<<"in deal else"<<endl;
				if(!strcmp(symch,"{"))
					genComplexSemi();//deal the complex sentence 
				else
					genSemi();//deal sentence
				getTrue();
				int c1=genCode("GOTO","-","-",pAd);
				deleteTrue(changeNumToString(c1));
				if(!strcmp(symch,"else"))
				{
					GetSymbol();
					if(!strcmp(symch,"{"))
						genComplexSemi();
					else
						genSemi();
					deleteTrue(changeNumToString(NextCodeLine));
				}
				else
				{
					error(11);
				}
			}
			else
			{
				error(12);	
			}
		}
		else
		{
			error(13);
		}
	}
}

void genLoopSemi()//循环语句
{
	if(!strcmp(symch,"while"))
	{
		GetSymbol();
		if(!strcmp(symch,"("))
		{	
			GetSymbol();
			int cp=PreCodeLine;//记录当前代码地址
			Condition();
			getTrue();
			int c=genCode("!=",temp,"1",pAd);
			deleteTrue(changeNumToString(c));
			if(!strcmp(symch,")"))
			{
				GetSymbol();
				Semi();
				genCode("GOTO","-","-",changeNumToString(cp));
				deleteTrue(changeNumToString(NextCodeLine));
			}
			else
			{
				error(12);
				
			}
		}
		else
		{
			error(13);
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?