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

📄 c0compiler.cpp

📁 c0文法编译器,测试可以在VC6.0下通过
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				return 1;
		}
		oprnum2=oprnum;
		if(gen(3,0,0))
			return 1;
		if(sym!=36)
		{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
		sym=getsym();
		if(statement())
			return 1;

		if(gen(4,0,oprnum1))
			return 1;
		opra[oprnum2].x=oprnum;

		for(a=0;a<j;a++){
			opra[oprnum4[a]].x=oprnum;
		}
	}
	else {
		errorline[errornum]=linenum;
		error[errornum++]=17;
		return 1;
	}
	return 0;
}




//scanf语句
int scanfstatement()	
{
	int a;
	sym=getsym();
	if(sym==37)
	{
		sym=getsym();
		if(sym!=1)
		{
			errorline[errornum]=linenum;
			error[errornum++]=27;
			return 1;
		}
		a=find();
		if(a==0)
		{
			errorline[errornum]=linenum;
			error[errornum++]=20;
			return 1;
		}
		if(Char[a].kind==0||Char[a].kind==3)
		{
			if(gen(6,Char[a].type,0))
				return 1;
			if(gen(22,Char[a].lev,Char[a].adr))
				return 1;
		}
		if((sym=getsym())!=36)
		{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
		if((sym=getsym())==38)
		{
			sym=getsym();
			return 0;
		}
		else {
			errorline[errornum]=linenum;
			error[errornum++]=22;
			return 1;
		}
		
	}
	errorline[errornum]=linenum;
	error[errornum++]=17;
	return 0;
}



//printf语句
int printfstatement()	
{
	int  i,oprnum1[MAXS],oprnum2,siss[MAXS];
	int	j=0;
	int	a=0;

	if((sym=getsym())==37)
	{
		if((sym=getsym())==5)
		{
			for(i=0;i<strlen(sisstring);i++)
			{
				if(sisstring[i]=='\\')
				{
					if(sisstring[++i]=='n')
					{
						if(gen(8,5,0))
							return 1;
					}
					else if(sisstring[i]=='t')
					{
						if(gen(8,6,0))
							return 1;
					}
					else
					{
						errorline[errornum]=linenum;
						error[errornum++]=21;
						return 1;
					}
				}
				else if(sisstring[i]!='%')
				{
					if(gen(1,11,sisstring[i]))
						return 1;
					if(gen(8,4,0))
						return 1;
				}
				else 
				{
					oprnum1[j]=oprnum;
					if(gen(4,0,0))
						return 1;
					siss[j++]=sisstring[++i];
				}
				
			}
			oprnum2=oprnum;
			if(j){
				if(gen(4,0,0))
					return 1;
			}
		}
		sym=getsym();
		for(i=0;i<j;i++)
		{
			a=1;
			if(sym!=39)
			{
				errorline[errornum]=linenum;
				error[errornum++]=13;
				return 1;
			}
			sym=getsym();
			opra[oprnum1[i]].x=oprnum;
			if(expression())
				return 1;
			if(siss[i]=='d')
			{
				if(gen(8,2,0))
					return 1;
			}
			else if(siss[i]=='f')
			{
				if(gen(8,3,0))
					return 1;
			}
			else if(siss[i]=='c')
			{
				if(gen(8,4,0))
					return 1;
			}
			else
			{
				errorline[errornum]=linenum;
				error[errornum++]=21;
				return 1;
			}
			if(gen(4,0,oprnum1[i]+1))
				return 1;
		}
		if(j)
			opra[oprnum2].x=oprnum;;
		if(sym==36)
		{
			if((sym=getsym())==38)
				sym=getsym();
			else{
				errorline[errornum]=linenum;
				error[errornum++]=22;
				return 1;
			}
		}
		else{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
	}
	else{
		errorline[errornum]=linenum;
		error[errornum++]=17;
		return 1;
	}
	return 0;
}




//return语句
int returnstatement()	
{
	if((sym=getsym())==37)
	{
		sym=getsym();
		if(expression())
			return 1;
		if(gen(7,typeofexp1,0))
			return 1;
		if(sym==36)
		{
			if((sym=getsym())==38)
			{
				sym=getsym();
				return 0;
			}
			else{
				errorline[errornum]=linenum;
				error[errornum++]=22;
				return 1;
			}
		}
		else{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
	}
	if(sym==38)
	{
		if(gen(1,11,0))
			return 1;
		if(gen(7,11,0))
			return 1;

		sym=getsym();
		return 0;
	}
	errorline[errornum]=linenum;
	error[errornum++]=22;

	return 1;
}



//main函数处理
int mainfunction()
{
	Isret=1;
	start=oprnum;
	Isret=1;
	strcpy(name[NumOfC],Word);
	if(enter(lev,0,5))
		return 1;
	Char[NumOfC-1].adr=oprnum;
	if((sym=getsym())!=37)
	{
		errorline[errornum]=linenum;
		error[errornum++]=17;
		return 1;
	}
	sym=getsym();
	while(sym==11||sym==12)
	{
		int i=sym;
		if((sym=getsym())==1)
		{
			strcpy(name[NumOfC],Word);
			if(enter(lev+1,i,3))
				return 1;
		}
		else
		{
			errorline[errornum]=linenum;
			error[errornum++]=27;
			return 1;
		}
		if((sym=getsym())!=39)
			break;
		sym=getsym();

		if(sym!=11&&sym!=12)
		{
			errorline[errornum]=linenum;
			error[errornum++]=4;
			return 1;
		}
	}
	if(sym==36)
	{
		if((sym=getsym())==40)
		{
			lev++;
			sym=getsym();
			if(sym==10)
			{
				sym=getsym();
				if(constdeclaration())
					return 1;
			}
			if(sym==11||sym==12) 
			{
				int i=sym;	
				if((sym=getsym())==1)
				{
					strcpy(name[NumOfC],Word);
					sym=getsym();
					if(sym!=39&&sym!=38)
					{
						errorline[errornum]=linenum;
						error[errornum++]=22;
						return 1;
					}
					if(sym==39||sym==38)
						if( vardefine(i))
							return 1;
					
				}
				else{
					errorline[errornum]=linenum;
					error[errornum++]=27;
					return 1;
				}
			}
			if(gen(9,0,numoflev[lev]))
				return 1;
			if(statementArray())
				return 1;

		}
		else
		{
			errorline[errornum]=linenum;
			error[errornum++]=23;
			return 1;		}
		if(sym==35)
		{
			backout();
			lev--;
			Isret=true;

			return 0;
		}
		else
		{
			errorline[errornum]=linenum;
			error[errornum++]=12;
			return 1;
		}
	}
	else 
	{
		errorline[errornum]=linenum;
		error[errornum++]=18;
		return 1;
	}
	Isret=true;
	return 0;
	
}




//从符号表中退出不用的符号
int backout()
{
	int i;
	for(i=NumOfC-1;i>=1;i--)
	{
		if(Char[i].kind==3)
			break;
		if(Char[i].kind==0||Char[i].kind==4)
			NumOfC--;
		numoflev[lev]=1;
	}
	return 0;
}




//产生一条表达式
int gen(int op,int lev,int x)		
{
	if(oprnum<MAXOP)
	{
		opra[oprnum].op=op;
		opra[oprnum].lev=lev;
		opra[oprnum].x=x;
		oprnum++;
	}
	else
	{
		errorline[errornum]=linenum;
		error[errornum++]=19;
		return 1;
	}
	return 0;
}




//解释执行
int Interpret()
{
	int i,j,a,equ=1;
	char c;
	bl[blnum++]=0;
	go[gonum++]=0;
	go[gonum++]=0;
	for(i=1;i<MAXC;i++)
	{
		if(Char[i].kind==0)
			gonum++;
		if(Char[i].kind!=0&&Char[i].kind!=4)
			break;
	}
	bl[blnum++]=gonum;
	go[gonum++]=0;
	go[gonum++]=0;

	for(i=start;i<oprnum;i++)
	{

		if(blnum>=MAXGOLEV)
		{
			errorline[errornum]=linenum;
			error[errornum++]=25;
			return 1;
		}
		if(gonum>=MAXGO)
		{
			errorline[errornum]=linenum;
			error[errornum++]=24;
			return 1;
		}
		switch(opra[i].op){

		case 0:
			if(opra[i].lev==1)
			{
				go[gonum++]=go[bl[0]+opra[i].x];
			}
			else 
				go[gonum++]=go[bl[blnum-1]+opra[i].x];
			break;
		case 1:	
			go[gonum++]=opra[i].x;
			break;
		case 2:
			if(equ)
				   i=opra[i].x-1;
			break;
		case 3:
			if(!equ)
				   i=opra[i].x-1;
			break;
		case 4:
			i=opra[i].x-1;
			break;
		case 5:
			if(go[gonum-1]==go[gonum-2])
			   {  
				equ=1;
				gonum-=2;
			   }
			else
			{
				gonum-=1;
				equ=0;
			}
			break;
		case 6:
			if(opra[i].lev==11)
			{
				scanf("%d",&j);
				go[gonum++]=j;
			}
			else if(opra[i].lev==13)
			{
				scanf("%c",&c);
				go[gonum++]=c;
			}
			break;
		case 7:
			if(opra[i].lev!=go[bl[blnum-1]+1])
			 {
				errorline[errornum]=linenum;
				error[errornum++]=26;
				return 1;
			 }
			i=go[bl[blnum-1]]-1;
			go[bl[blnum-1]]=go[--gonum];
			gonum=bl[--blnum]+1;
			break;
		case 8:
			if(opra[i].lev==4)
				printf("%c",go[--gonum]);
			else if(opra[i].lev==5)
				printf("\n");
			else if(opra[i].lev==6)
				printf("\t");
			else printf("%d",go[--gonum]);
			break;
		case 9:	
			gonum=bl[blnum-1]+opra[i].x+1;
			break;
		case 10:
			if(opra[i].lev==11)
			{	
				go[gonum-2]=go[gonum-1]+go[gonum-2];
			}
			else
			{
				go[gonum-3]=go[gonum-3]+go[gonum-1];
				gonum++;
			}
			gonum-=1;
			break;
		case 11:
			go[gonum-2]=go[gonum-2]-go[gonum-1];
			gonum-=1;
			break;
		case 13:
			go[gonum-2]=go[gonum-2]*go[gonum-1];
			gonum-=1;
			break;
		case 14:
			go[gonum-2]=go[gonum-2]/go[gonum-1];
			gonum-=1;
			break;
		case 15:
			go[gonum-1]=-go[gonum-1];
			break;

		case 16:
			if(go[gonum-2]>go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
			
			break;
		case 17:
			if(go[gonum-2]<go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
	
			break;
		case 18:
			if(go[gonum-2]==go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
			break;
		case 19:
			if(go[gonum-2]!=go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
			break;
		case 20:
			if(go[gonum-2]>=go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
			break;
		case 21:
			if(go[gonum-2]<=go[gonum-1])
				equ=1;
			else
				equ=0;
			if(opra[i].lev==11)
				gonum-=2;
			break;
		case 22:
			if(opra[i].lev==1)go[bl[0]+opra[i].x]=go[--gonum]
				;
			else
				go[bl[blnum-1]+opra[i].x]=go[--gonum];
			break;
		case 23:
			a=gonum;
			go[gonum+1]=opra[i].lev;
			gonum=gonum+2;
			break;
		case 24:
			bl[blnum++]=a;
			go[a]=i+1;
			i=opra[i].x-1;
			break;
		case 25:i=go[bl[blnum-1]]-1;
			gonum=bl[--blnum];
			break;
		}
	}
	return 0;
}




//主函数
void main(int argc,char *argv[])
{
	int c=0;
	printf("*******************************************\n");
	printf("C0 compiler version 1.0\nwriten by XIA QING\n");

	if(argc!=2){
		printf("请输入编译源程序文件名:\n");
		scanf("%s",fp);
	}
	else
		strcpy(fp,argv[1]);
	
	if(strchr(fp,'.')==NULL)
		strcat(fp,".txt");

	FIN=fopen(fp,"r");
	
	if(FIN==NULL)
	{
		printf("file not found!\n");
		exit(1);
	}

//for test
//	strcpy(fp,"test5.txt");
//	FIN = fopen(fp,"r");
	printf("\n源程序:\n");
		 FOUT=stdout;
	
	for(int j=0;j<MAXLEV;j++) 
		numoflev[j]=1;

	
	if(program()){
		int i=errornum;
		for(errornum=0;errornum<i;errornum++)
		{
			error_msg(error[errornum]);
		}
		return ;
	}
	 printf("\n\n编译通过!\n\n");
	 printf("运行结果 :\n");
	 
	if(Interpret()){
		return ;
	}

	printf("是否显示中间代码\t\t是:0\t否:1\n");
	scanf("%d",&c);
	if(!c)
	{
		printf("中间代码:\n");
	 int i;
	 for(i=0;i<oprnum;i++)
	 {
		 fprintf(FOUT,"%d\t%s\t%d\t%d\t%d\n",i,oprate[opra[i].op],
			 opra[i].op,opra[i].lev,opra[i].x);
	 }
	}
	
	return ;

}

⌨️ 快捷键说明

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