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

📄 declaration.cpp

📁 PL语言到中间代码的编译程序
💻 CPP
字号:
void ConstDeclaration()		//常量说明
{
	char *const_name;
	int neg_value=0;
	NametabItem *find;

	assert(CurSymbol->Type==IDENT);
	const_name=CurSymbol->Value.lpValue;
	if(FindSameLevelNametabItem(const_name,CONSTANT) || FindSameLevelNametabItem(const_name,VARIABLE))
	{
		Error(15);
		return;
	}
	GotoNextSymbol();
	if(CurSymbol->Type!=EQL)
		Error(16);
	else
		GotoNextSymbol();
	if(CurSymbol->Type==CHARCON)
	{
		LastName=AddNametabItem(const_name,CONSTANT,TCHAR,1,CurSymbol->Value.iValue,NULL,LastName);  
		GotoNextSymbol();
		return;
	}
	if(CurSymbol->Type==PLUS ||CurSymbol->Type==MINUS)
	{
		neg_value=(CurSymbol->Type==MINUS);
		GotoNextSymbol();
	}
	if(CurSymbol->Type!=IDENT && CurSymbol->Type!=INTCON)
		Error(17);
	else
		if(CurSymbol->Type==INTCON)
			LastName=AddNametabItem(const_name,CONSTANT,TINT,1,CurSymbol->Value.iValue,NULL,LastName);  
		else
		{
			find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,CONSTANT);
			if(find)
				LastName=AddNametabItem(const_name,CONSTANT,find->Type,1,find->Value,NULL,LastName);  
			else
				Error(17);
		}
	GotoNextSymbol();
}

void VarDeclaration()	//变量说明
{
	char *var_name[MAXVARNUMBER];
	char type_name[VARNAMESIZE];
	int var_index=0;

	assert(CurSymbol->Type==IDENT); 
	var_name[var_index++]=CurSymbol->Value.lpValue;  
	GotoNextSymbol();
	while(CurSymbol->Type==COMMA)
	{
		GotoNextSymbol();
		if(CurSymbol->Type!=IDENT)
			Error(11);
		var_name[var_index++]=CurSymbol->Value.lpValue;  
		GotoNextSymbol();
	}
	if(CurSymbol->Type!=COLON)
		Error(12);
	else
		GotoNextSymbol();
	if(CurSymbol->Type!=IDENT)
		Error(13);
	NametabItem *find_type;
	strcpy(type_name,CurSymbol->Value.lpValue);
	GotoNextSymbol();
	find_type=FindLowLevelNametabItem(type_name,NTYPE);
	if(find_type)
		for(int i=0;i<var_index;i++)
		{
			if(!FindSameLevelNametabItem(var_name[i],VARIABLE) && !FindSameLevelNametabItem(var_name[i],CONSTANT))
				LastName=AddNametabItem(var_name[i],VARIABLE,find_type->Type,1,find_type->Value,find_type->Ref,LastName);
			else
				Error(15);
		}
	else
		Error(14);
}

void TypeDeclaration()
{
	char *type_name;
	NametabItem *find;
	int low,high,size;
	ArrayItem *last=NULL,*current;

	assert(CurSymbol->Type==IDENT);
	type_name=CurSymbol->Value.lpValue;
	if(FindSameLevelNametabItem(type_name,NTYPE))
	{
		Error(15);
		return;
	}
	GotoNextSymbol();
	if(CurSymbol->Type!=EQL)
		Error(16);
	
	GotoNextSymbol();
	if(CurSymbol->Type==IDENT)
	{
		find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,NTYPE);
		GotoNextSymbol();
		if(find)
			LastName=AddNametabItem(type_name,NTYPE,find->Type,1,find->Value,NULL,LastName);  
		else
			Error(18);
		return;
	}
	else if(CurSymbol->Type!=ARRAYSYM)
		Error(18);
	GotoNextSymbol();
	if(CurSymbol->Type!=LBRACK)
		Error(19);
	do
	{	
		GotoNextSymbol();
		if(CurSymbol->Type!=INTCON)
			Error(19);
		low=CurSymbol->Value.iValue; 
		GotoNextSymbol();
		if(CurSymbol->Type!=DPOINT)
			Error(19);
		GotoNextSymbol();
		if(CurSymbol->Type!=INTCON)
			Error(19);
		high=CurSymbol->Value.iValue;
		last=AddArrayItem(low,high,last);
		GotoNextSymbol();
	}while(CurSymbol->Type==COMMA);
	if(CurSymbol->Type!=RBRACK)
		Error(19);
	GotoNextSymbol();
	if(CurSymbol->Type!=OFSYM)
		Error(20);
	else
		GotoNextSymbol();
	if(CurSymbol->Type!=IDENT)
		Error(14);
	else
	{
		find=FindLowLevelNametabItem(CurSymbol->Value.lpValue,NTYPE);
		GotoNextSymbol();
		if(find)
		{
			for(size=1,current=last;current;current=current->Elref)
				size*=current->Size ; 
			LastName=AddNametabItem(type_name,NTYPE,TARRAY,find->Type,size,last,LastName);  
				//这里借用normal字段填写type
		}
		else
			Error(18);
		return;
	}
}

void ParaDeclaration()
{	
	int var_define;
	char *var_name[MAXVARNUMBER];
	char *type_name;
	int var_index,i;
	int first_var;
	NametabItem *find;

	do
	{
		var_index=0;
		GotoNextSymbol();
		if(CurSymbol->Type==VARSYM)
		{
			var_define=1;
			GotoNextSymbol();
		}
		else
			var_define=0;
		first_var=1;
		do
		{
			if(!first_var)
				GotoNextSymbol();
			if(CurSymbol->Type!=IDENT)
				Error(11);
			var_name[var_index++]=CurSymbol->Value.lpValue;  
			first_var=0;
			GotoNextSymbol();
		}
		while(CurSymbol->Type==COMMA);
		if(CurSymbol->Type!=COLON)
			Error(12);
		GotoNextSymbol();
		if(CurSymbol->Type!=IDENT)
			Error(13);
		type_name=CurSymbol->Value.lpValue;
		for(i=0;i<var_index;i++)
		{
			find=FindLowLevelNametabItem(type_name,NTYPE);
			if(find)
				LastName=AddNametabItem(var_name[i],VARIABLE,find->Type,var_define?-1:0,find->Value,find->Ref,LastName); 
			else
				Error(14);
		}
		GotoNextSymbol();
	}
	while(CurSymbol->Type==SEMICOLON);
	if(CurSymbol->Type!=RPAREN)
		Error(22);
	GotoNextSymbol();
}

void ProcedureDeclaration()
{
	char *proc_name;
	NametabItem *last_name;
	ObjItem *proc_begin,*fill_back_var_size;
	
	assert(CurSymbol->Type==PROCSYM);
	GotoNextSymbol();
	if(CurSymbol->Type!=IDENT)
		Error(21);
	proc_name=CurSymbol->Value.lpValue;  
	if(!FindSameLevelNametabItem(proc_name,PROCEDURE))
		LastName=AddNametabItem(proc_name,PROCEDURE,NOTYPE,1,0,NULL,LastName);
	else
		Error(15);
	last_name=LastName;			//实际上是压栈,保护全局的LastName
	LastName=NULL;

	GotoNextSymbol();
	EnterBlock();
	if(CurSymbol->Type==LPAREN)
	{	//参数表
		ParaDeclaration();
	}

	LastName=NULL;
	if(CurSymbol->Type!=SEMICOLON)
		Error(6);
	GotoNextSymbol();
	last_name->Value=CurrentCode->LineNum;  //回填转子地址  
	last_name->Ref=Display[DisplayLevel-1];	//回填过程内情变量
#ifdef _DEBUG
	printf("\n;-----------------Procdure %s Begin------------------------\n",proc_name);
#endif
	fill_back_var_size=GenerateCode(ENTP,DisplayLevel-1,0);
	proc_begin=ProgramBlock();
	fill_back_var_size->DestOp.iValue=Display[DisplayLevel-1]->PSize+Display[DisplayLevel-1]->VSize;
	GenerateCode(RETP,0,0);
	QuitBlock();
#ifdef _DEBUG
	printf(";-----------------Procdure %s End--------------------------\n\n",proc_name);
#endif
	LastName=last_name;			//弹栈
	if(CurSymbol->Type!=SEMICOLON)
		Error(6);
	GotoNextSymbol();
}

⌨️ 快捷键说明

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