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

📄 c0compiler.cpp

📁 c0文法编译器,测试可以在VC6.0下通过
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					Char[NumOfC].uchar.cischar =cischar;
			}

			NumOfC++;
		}
	else
	{
		errorline[errornum]=linenum;
		error[errornum++]=7;
		return 1;
	}
	return 0;
}



//检查参数
int charcheck()
{
	int i;
	for(i=NumOfC-1;i>=0;i--)
	{
		if(Char[i].lev<lev)
			return 0;
		else
		{
			if(!strcmp(Char[i].name,name[NumOfC]))
				return 1;
		}
	}
	return 0;
}



//在符号表中查找标识符是否存在
int find()			
{
	int i,j=1;
	for(i=NumOfC-1;i>=1;i--)
	{
		if(Char[i].lev<lev)
			j=0;
		if(Char[i].kind!=3||j)
			if(!strcmp(Char[i].name,Word))
				return i;
	}
	return 0;
}



//语句列
int statementArray()
{
	int a=0;
	while(sym==1||sym==15||sym==18||
		sym==40||sym==19||sym==20||sym==21)
	{
		if((a=statement())==1)
			return 1;
	} 
	if(sym==38)
		sym=getsym();
	return 0;
}



//语句
int statement()
{
	int a;
	switch(sym){

	case 15:
		return(ifstatement());
	case 18:
		return(whilestatement());
	case 19:
		return(scanfstatement());
	case 20:
		return(printfstatement());
	case 21:
		if(Isret)
		{
			errorline[errornum]=linenum;
			error[errornum++]=14;
			return 1;
		}
		return(returnstatement());
	case 1:
		if((a=find())==0)
			   return 1;
		sym=getsym();
		if(Char[a].kind==0||Char[a].kind==3)
		{
			if(sym==51)
				return(assignstatement(a));
			else 
			{
				errorline[errornum]=linenum;
				error[errornum++]=9;
				return 1;
			}
		}
		else if(Char[a].kind==1||Char[a].kind==2)
		{
			if(sym==37)
			{
				if(call(a))
					return 1;
				if(sym==38)
					sym=getsym();
				else
				{
					errorline[errornum]=linenum;
					error[errornum++]=22;
					return 1;
				}
				return 0;
			}
			else
			{
				errorline[errornum]=linenum;
				error[errornum++]=17;
				return 1;
			}
		}
		else 
		{
			errorline[errornum]=linenum;
			error[errornum++]=10;
			return 1;
		}
	case 40:
		sym=getsym();
		if((a=statementArray())==1)
			return 1;
		if(sym!=35)
		{
			errorline[errornum]=linenum;
			error[errornum++]=12;
			return 1;
		}
		sym=getsym();
		return a;
	case 38:
		sym=getsym();
		return 1;
	default:
		return 1;
	}
	return 1;
}


//表达式
int expression()
{
	bool anti=false;
	if(sym==31||sym==32)//带有符号+、-
	{
		if(sym==32)
		{
			anti=true;//为负数
		}
		sym=getsym();
	}

	if(term())
	{
		return 1;
	}

	if(anti)
	{
		if(gen(15,typeofexp1,0))
		{
			return 1;
		}
	}

	while(sym==31||sym==32)
	{
		typeofexp2=typeofexp1;
		int a=sym;
		sym=getsym();
		if(term())
			return 1;
		if(gen(a-21,typeofexp2,typeofexp1))
			return 1;
		if(typeofexp2>typeofexp1)
			typeofexp1=typeofexp2;
	}

	return 0;
}



//项
int term()		
{
	if(factor())
		return 1;
	while(sym==33||sym==34)//×或÷
	{
		typeofexp2=typeofexp1;
		int a=sym;
		sym=getsym();
		if(factor())
			return 1;
		if(gen(a-20,typeofexp2,typeofexp1))//??????????
			return 1;
		if(typeofexp2>typeofexp1)
			typeofexp1=typeofexp2;
	}
	return 0;
}



//因子
int factor()			
{
	typeofexp1=11;//int
	if(sym==1)
	{
		int a=find();
		if(a==0)
		{
		 	errorline[errornum]=linenum;
		 	error[errornum++]=20;
			return 1;
		}
		if(Char[a].kind==4)//字符
		{	
			if(Char[a].type==11)
				if(gen(1,Char[a].type,Char[a].uchar.num ))
					return 1;

			if(Char[a].type==12)
				if(gen(1,Char[a].type-2,Char[a].uchar.cischar))//?????????
					return 1;

			sym=getsym();
		}
		else if(Char[a].kind==0||Char[a].kind==3)
		{
			if(gen(0,Char[a].lev,Char[a].adr))
				return 1;
			if(Char[a].type==12)
				typeofexp1=11;
			else 
				typeofexp1=Char[a].type;
			sym=getsym();
		}
		else if(Char[a].kind==2)
		{
			if((sym=getsym())==37)//(
			{
				if(call(a))
					return 1;
			}
			else 
			{
				errorline[errornum]=linenum;
				error[errornum++]=17;
				return 1;
			}
		}
		else 
		{
			errorline[errornum]=linenum;
			error[errornum++]=11;
			return 1;
		}
		return 0;
	}
	else if(sym==37)//(
	{
		sym=getsym();
		if(expression())
			return 1;
		if(sym!=36)//)
		{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
		else 
			sym=getsym();
		return 0;
	}
	else if(sym==2)
	{
		if(gen(1,11,num))
			return 1;
		sym=getsym();
		return 0;
	}
	else if(sym==4)
	{
		if(gen(1,11,cischar))
			return 1;
		sym=getsym();
		return 0;
	}
	else
	{
		errorline[errornum]=linenum;
		error[errornum++]=6;
		return 1;
	}
	return 0;
}





//子函数调用
int call(int a)
{
	int i;
	if(gen(23,Char[a].type,0))
		return 1;
	sym=getsym();

	for(i=a+1;i<MAXC;i++)
	{
		if(Char[i].kind!=3)
			break;
		if(expression())
			return 1;
		if(sym==39)//,
			sym=getsym();
		else
			break;
	}
	if(Char[i].kind!=3&&sym!=36||Char[i+1].kind==3&&sym==36)//)
	{
		errorline[errornum]=linenum;
		error[errornum++]=16;
		return 1;
	}
	
	if(gen(24,0,Char[a].adr))//?????????????????????????
		return 1;

	if(sym==36)
	{	
		sym=getsym();
		return 0;
	}
	else
	{
		errorline[errornum]=linenum;
		error[errornum++]=18;
		return 1;
	}
	return 0;
}




//有返回值的函数
int returnfunction( int type)		
{
	Isret=0;
	if(enter(lev,type,2))
		return 1;
	Char[NumOfC-1].adr=oprnum;
	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!=38&&sym!=39)
					{
						errorline[errornum]=linenum;
						error[errornum++]=22;
						return 1;
					}
					if(sym==38||sym==39)
					{
						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)
		{
			sym=getsym();
			backout();
			lev--;
			if(gen(7,0,0))return 1;
			return 0;
		}
		else 
		{
			errorline[errornum]=linenum;
			error[errornum++]=12;
			return 1;
		}
	}
	else 
	{
		errorline[errornum]=linenum;
		error[errornum++]=18;
		return 1;
	}
}


//无返回值的函数定义语句
int voidfunction()		
{
	Isret=1;
	strcpy(name[NumOfC],Word);
	if(enter(lev,0,1))
		return 1;
	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!=38&&sym!=39)
					{
						errorline[errornum]=linenum;
						error[errornum++]=22;
						return 1;
					}
					if(sym==38||sym==39)
						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--;
			if((sym=getsym())==13)
				if((sym=getsym())==1)
					return(voidfunction());

			if(gen(25,0,0))
				return 1;

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



//赋值语句
int assignstatement(int a)	
{
	sym=getsym();
	if(expression())
		return 1;
	if(typeofexp1!=Char[a].type)//类型不匹配
	{
		errorline[errornum]=linenum;
		error[errornum++]=28;
		return 1;
	}

	if(gen(22,Char[a].lev,Char[a].adr))
		return 1;

	if(sym!=38)//缺少;
	{
		errorline[errornum]=linenum;
		error[errornum++]=22;
		return 1;
	}
	sym=getsym();
	return 0;
}



//if条件语句
int ifstatement()		
{
	int oprnum1,oprnum2,a;
	if((sym=getsym())==37)
	{
		sym=getsym();
		if(expression()) 
			return 1;
		a=typeofexp1;
		if(sym==45||sym==46||sym==47||sym==48||sym==49||sym==50)
		{
			int b=sym;
			sym=getsym();
			if(expression())
				return 1;
			if(gen(b-29,a,typeofexp1))
				return 1;
		}
		oprnum1=oprnum;
		if(gen(3,0,0))
			return 1;
		if(sym!=36)
		{
			errorline[errornum]=linenum;
			error[errornum++]=18;
			return 1;
		}
		sym=getsym();
		if(statement()==1)
			return 1;
		if(sym==16)
		{
			oprnum2=oprnum;
			if(gen(4,0,0))
				return 1;
			opra[oprnum1].x=oprnum;
			sym=getsym();
			if(statement()==1)
				return 1;
			opra[oprnum2].x=oprnum;
		}
		else opra[oprnum1].x=oprnum;
		
	}
	else{
		errorline[errornum]=linenum;
		error[errornum++]=17;
		return 1;
	}
	return 0;
}

	

//while循环语句
int whilestatement()	
{
	int oprnum1=oprnum,oprnum2,oprnum4[MAXCASE],a,j=0;
	if((sym=getsym())==37)
	{
		sym=getsym();
		if(expression()) 
			return 1;
		a=typeofexp1;

		if(sym==45||sym==46||sym==47||sym==48||sym==49||sym==50)
		{
			int b=sym;
			sym=getsym();
			if(expression())
				return 1;
			if(gen(b-29,a,typeofexp1))

⌨️ 快捷键说明

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