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

📄 hao2.h

📁 设计一个实用的小型类C语言的编译器
💻 H
字号:
#ifndef HAO2
#define HAO2
#include"hao1.h"
#include"scaner.h"
void scaner();
int yuGuKuai();
int yu();
void lrparser();
int isIf();
int isWhile();
int isTiao();
int statement();
int yucu();
char *exception();
char *factor();
char *term();
int isGxi();
void emit(char *op,char *argv1,char *argv2,char *result)
{
	strcpy(pQuad[nNXQ].op ,op);
	strcpy(pQuad[nNXQ].argv1,argv1);
    strcpy(pQuad[nNXQ].argv2,argv2);
    strcpy(pQuad[nNXQ].result,result);
	nNXQ++;
	return;
}
void PrintQuaternion()
{
	int nLoop;
	for(nLoop=1;nLoop<nNXQ;nLoop++)
	{
		fout4<<nLoop<<".  ("<<pQuad[nLoop].op<<","<<pQuad[nLoop].argv1 <<","
			<<pQuad[nLoop].argv2<<","<<pQuad[nLoop].result<<")"<<endl;
	}
}

char*Newtemp()
{
	char *p;
	char m[MAXLENGTH];	
	p=(char*)malloc(MAXLENGTH);
	k++;
	itoa(k,m,10);
	strcpy(p+1,m);
	p[0]='T';
	return(p);
}

void lrparser()                      //<程序>→main()<语句块>
{
//	int schain=0;
	if(syn==1) ////////// main
	{
		scaner();
		if(syn==26)/////(
		{
	    	scaner();
			if(syn==27)/////)
			{ 
				scaner();
			     yuGuKuai();
				if(syn==-1&&kk==0)////////////  #
		          cout<<"success"<<endl;
				else
					cout<<"file!"<<endl;

			}
			else cout<<"第"<<row<<"行缺少')' "<<"缺)错误"<<endl,kk=1;
		}
		else cout<<"第"<<row<<"行缺少'(' "<<"缺(错误"<<endl,kk=1;
	}
	else 
	{
		cout<<"main"<<endl;
		cout<<"第"<<row<<"行缺少main()函数"<<endl;kk=1;
	}
		return;
}
int yuGuKuai()                      //<语句块>→'{'<语句块>'}'
{
	int schain=0;
	if(syn==30)//////{
	{
		scaner();
    	if(syn==2||syn==3)/////////int   or  char
		{	
			scaner();//////////syn=10
			schain=yucu();
	    	if(syn==31)////////////   }
			{
			    scaner();
		    	
			}
			else {if(kk!=1)  cout<<syn<<"缺}错误"<<endl;kk=1;}
		}
		else
		{
			schain=yucu();
			if(syn==31)
			{
				scaner();
			}
			else {if(kk!=1)  cout<<syn<<"缺}错误"<<endl;kk=1;}
		}
	}
	else{  cout<<syn<<"{错误"<<endl; kk=1;}
		return schain;
}
int yucu()                                //<语句串>→<语句>{;<语句>};
{   
	int schain=0;
    schain=yu();
	while(syn==34)///////////;
	{
    	scaner();
		schain=yu();
	}
	return schain;
}
int yu()                               //<语句>→<赋值语句>|<条件语句>|<循环语句>
{
	int schain=0;
    if(syn==4)  schain=isIf();   ///////// if
	if(syn==7)  schain=isWhile();////////////while
    if(syn==10)	schain=statement();////////////// yufshfhdf
	return schain;
}
int isIf()                            //<条件语句>→if<条件><语句块>
{
		char tt[MAXLENGTH],eplace[MAXLENGTH];
	   int schain=0;

	if(syn==4) /////////if()
	{
		scaner();
	    schain=isTiao();
			schain=yuGuKuai();
	}
   else cout<<"if错误"<<endl,kk=1;
	return schain;
}
int isWhile()                        //<循环语句>→while<条件><语句块>
{
	char tt[MAXLENGTH],eplace[MAXLENGTH];
	   int schain=0;
	if(syn==7) /////////////while
	{
	     	scaner();
	    schain=isTiao();
		schain=yuGuKuai();
	}
    else cout<<"第"<<row<<"while错误"<<endl,kk=1;
	return schain;
}
int isTiao()                     //<条件>→<表达式><关系符><表达式>)
{
	int schain=0;
	char *eplace1,*eplace2,*tt,*tp;
    tp=(char*)malloc(MAXLENGTH);
	eplace1=(char*)malloc(MAXLENGTH);
	eplace2=(char*)malloc(MAXLENGTH);
	tt=(char*)malloc(MAXLENGTH);

	if(syn==26)  ////////////  (
	{
		scaner();
       eplace1=exception();
	   strcpy(tt,token);
	   schain=isGxi();
	   eplace2=exception();
	   emit(tt,eplace1,eplace2," ");
	  if(syn==27)   //////////  )
	  { scaner();}
	  else cout<<"第"<<row<<")错误"<<endl,kk=1;
	}
	else cout<<"第"<<row<<"(错误"<<endl,kk=1;
	  return schain;
}

int statement()  //<赋值语句>→ ID =<表达式>
{ 
		char tt[MAXLENGTH],eplace[MAXLENGTH];
	    int schain=0;

	if(syn==10) ////////////  sdf2
	{
		strcpy(tt,token);
		scaner();
		if(syn==21) //////////=
		{
		
			scaner();
			strcpy(eplace,exception());
			emit("=",eplace," ",tt);
			schain=0;
			
		}
		else{cout<<"第"<<row<<"赋值错误"<<endl;kk=1;}
	}
	else{cout<<"第"<<row<<"赋值语句错误"<<endl;kk=1;}////////////////
	return schain;
}
char *exception()                      //<表达式>→<项>{+<项>|-<项>}
{
	char *tp,*ep2,*eplace,*tt;
	tp=(char*)malloc(MAXLENGTH);
	ep2=(char*)malloc(MAXLENGTH);
	eplace=(char*)malloc(MAXLENGTH);
	tt=(char*)malloc(MAXLENGTH);
 strcpy(eplace,term());
	while(syn==22||syn==23)////////////+  or -
	{
		if(syn==22) strcpy(tt,"+");
		else strcpy(tt,"-");
     	scaner();
		strcpy(ep2,term());
		strcpy(tp,Newtemp());
		emit(tt,eplace,ep2,tp);
		strcpy(eplace,tp);
	}
	return eplace;
}
char *term()                          //<项>→<因子>{*<因子>|/<因子>}
{
	char *tp,*ep2,*eplace,*tt;
	tp=(char*)malloc(MAXLENGTH);
	ep2=(char*)malloc(MAXLENGTH);
	eplace=(char*)malloc(MAXLENGTH);
	tt=(char*)malloc(MAXLENGTH);
  strcpy(eplace,factor());
	while(syn==24||syn==25)///////////*    or /
	{
		if(syn==24) strcpy(tt,"*");
		else strcpy(tt,"/");
	    scaner();
		strcpy(ep2,factor());
		strcpy(tp,Newtemp());
		emit(tt,eplace,ep2,tp);
		strcpy(eplace,tp);
	
	}
	return eplace;
}
char *factor()                       //<因子>→ ID | NUM |(<表达式>)
{
	char *fplace;
	fplace=(char*)malloc(MAXLENGTH);
	strcpy(fplace," ");
	if(syn==10||syn==20)    ////////ID   or NUM
	{      if(syn==10)
	 {strcpy(fplace,token);}
	     else
		 {
			 itoa(atoi(token),fplace,10);
		 }

	    	scaner();
	}
	else if(syn==26) ///////(
	{
			 scaner();
			fplace=exception();
			 if(syn==27)  ////////// )
			 { scaner();}
			 else cout<<"第"<<row<<")错误"<<endl,kk=1;
	}
	else {cout<<"第"<<row<<"(错误"<<endl;kk=1;}///////////////////////
		return fplace;
}
int isGxi()                      //关系符>→<|<=|>|>=|=|!=
{
	int schain=0;
      if(syn==38||syn==36||syn==35||syn==37||syn==39||40)
	  { scaner();
	  }
	  else {cout<<"第"<<row<<"关系运算符错误"<<endl;kk=1;}
	  return schain;
}
#endif

⌨️ 快捷键说明

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