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

📄 sentence.cpp

📁 编译原理中的语法分析和语义分析
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			   {
				   tag=5;
				  // cout<<name<<' '<<number<<endl;getch();
				   value=Blockanalyse();//getch();
				   if(value==1)
				   {
					   if(GetWord()==1)
					   {
						   if(number==29)
						   {
							   value=procanalyse();
						   }
						   else
						   {
							   BackWord();
						   }
					   }
				   }
			   }
		}	   
	}
	if(value==0)
	{
		cout<<"procudure error"<<endl;
	}
	else
	{
		cout<<"procudure finish"<<endl;
	}
	depth--;
	dspnum--;
	varnum-=dpstack[dspnum].varend-dpstack[dspnum].varstart;
	constnum-=dpstack[dspnum].constend-dpstack[dspnum].conststart;	
//	cout<<dpstack[dspnum].varend-dpstack[dspnum].varstart<<endl;
//	cout<<dpstack[dspnum].constend-dpstack[dspnum].conststart<<endl;
//	cout<<varnum<<' '<<constnum<<endl;
//	cout<<name<<' '<<number<<endl;//////////////////
//	getch();
	return value;
}
void sentence::ProcError(int tag)//新过程分析错误处理
{
	errornum++;
	switch(tag)
	{
	case ID:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能作为过程的名称!"<<endl;
		    break;
	case 27:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 位置非法,该位置应为字符'(' !"<<endl;
		    break;
	case ID+1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能作为过程的参数!"<<endl;
		    break;
	case 28:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 前缺少符号')' !"<<endl;
		    break;
	case 29:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 前缺少符号';' !"<<endl;
		    break;
	}
}
int sentence::bodyanalyse()//过程主体分析
{
	stateanalyse();
	if(number==29)
	{
		return bodyanalyse();
	}
	else if(number==35)
		return 0;
	else
	{
		if(number==END)
		{
			GetWord();
			if(number!=29)// 符号;
				BackWord();
			return 1;
		}
		else if(number>=PROGRAM&&number<=ODD)
		{
			return 1;
		}
		else
		{
			BodyError(0);////////////////
			;//error
		}
		
	}
	return 0;
}
void sentence::BodyError(int tag)//过程主体分析错误处理
{
	cout<<"bodyanalyse error"<<endl;
}
int sentence::stateanalyse()//语句分析
{
	int type;
	type=GetWord();
	if(type==0)
		return 1;
	switch(number)
	{
	case ID:return idanalyse();
	case IF:return itlanalyse();
	case WHILE:return whileanalyse();
	case CALL:return callanalyse();
	case BEGIN:return bodyanalyse();
	case READ:return readanalyse();
	case WRITE:return writeanalyse();
	default:if(number>=PROGRAM&&number<=ODD)
				break;
		    else
			{
				GetWord();
				return 0;
				cout<<"error"<<endl;
			}
	}
	return 1;
}
void StateError(int tag)//语句分析错误处理
{
}
int sentence::idanalyse()//赋值语句分析
{
	int type,value=0;
	char id[10];
	strcpy(id,name);
	if(IsVar(name)==-1)
	{
		IdError(0);//error
		Error();
		errornum--;
		return 0;
	}
	type=GetWord();
	if(type==0)
	{
		;//error
		return 0;
	}
	if(number==26)
	{
		value=expanalyse();
		if(value==1)
		{
			IsVar(id);
			CodeFile<<"code"<<++codenum<<": STO "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
		}
		else
		{
			IdError(1);
		}
	}
	cout<<"id finish  "<<value<<endl;
	return value;
}
void sentence::IdError(int tag)//赋值语句分析错误分析
{
	errornum++;
	switch(tag)
	{
	case 0:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":标识符 "<<name<<" 不能被赋值!"<<endl;
		   break;
	case 1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":赋值语句不完整!"<<endl;
		   break;
	}
}
int sentence::itlanalyse()//if_then_else语句分析
{
	int type,value,num=0,index1,start1,end1,index2,start2,end2;
	char data[9];
	if(lexpanalyse()==1)
	{
		type=GetWord();
		if(type==0)
		{
			cout<<"if_then_else 语句中缺少 then"<<endl;
			;//error 
		}
		if(number==THEN)
		{
			CodeFile<<"code"<<++codenum<<": JPC 0,"<<codenum+3<<endl;//跳转到 then 部分
			CodeFile<<"code"<<++codenum<<": JMP 0,             "<<endl;
            index1=update_data.sum++;
			start1=codenum;//第一个转移指令,跳到 else 部分
			strcpy(data,": JMP 0,");
			if(stateanalyse()==1)
			{
				CodeFile<<"code"<<++codenum<<": JMP 0,             "<<endl;
				end1=codenum+1;
				index2=update_data.sum++;
				start2=codenum;//第二个转移指令,从 then 部分跳出 if_then_else 语句
				cout<<"then   "<<name<<endl;/////////////////////////
				if(number==29)
					num=29;
				if(number!=ELSE)
				{
					if(number!=29||number>=PROGRAM&&number<=ODD)// 符号 ;
						BackWord();
				///	GetWord();
					if(number==29)
				    	number=num;
					value=1;					
				}
				else
				{
					value=stateanalyse();
					
				}
				end2=codenum+1;
			}
			else if(number==29)
			{
				value=1;
			}
			else
			{
				cout<<name<<' '<<number<<endl;
				cout<<" then state error"<<endl;//////////////////
				value=0;
			}
		}
	}
	else
	{
		cout<<"if_then_else lexp error"<<endl;/////////////////////
		value=0;
		;//
	}
	Insert(index1,start1,end1,data);
	Insert(index2,start2,end2,data);
	cout<<"if_then_else finish "<<value<<endl;
	return value;
}
void sentence::Itlanalyse(int tag)//if_then_else语句分析错误处理
{
}
int sentence::whileanalyse()//while_do语句分析
{
	int type,value,start_position,start,end,index;
	char data[9];
	start_position=codenum+1;
	if(lexpanalyse()==1)
	{
		CodeFile<<"code"<<++codenum<<": JPC 0,                    "<<endl;//跳出循环
        start=codenum;
		index=update_data.sum++;
		type=GetWord();
		if(type==0)
		{
			;//error
			value=0;
		}
		if(number==DO)
			value=stateanalyse();
	}
	else
	{
		;//error
		value=0;
	}
	cout<<"while_do finish   "<<value<<endl;
    CodeFile<<"code"<<++codenum<<": JMP 0,"<<start_position<<endl;//跳回程序条件判断部分
	end=codenum+1;
	Insert(index,start,end,": JPC 0,");
	return value;
}
void sentence::WhileError(int tag)//while_do语句分析错误处理
{
}
int sentence::callanalyse()//call语句分析
{
	int type,value;
	type=GetWord();
	if(type==0)
	{
		;//error
		return 0;
	}
	if(number==ID)
	{
		type=GetWord();
		if(type==0)
			value=1;
		if(number==27)// 符号 (
		{
			while(1)
			{
				if(expanalyse()==1)
				{
					if(number==30)// 符号 ,
						continue;
					else if(number==28)// 符号 )
					{
						value=1;
						GetWord();
						if(number!=29)//没有后继语句
							BackWord();
					//	cout<<name<<' '<<number<<endl;getch();
						break;
					}
				}
				else
				{
					;//error
					value=0;
					break;
				}
			}
		}
	}
	cout<<"call finish  "<<value<<endl;
	return value;
}
void sentence::CallError(int tag)//call语句分析错误处理
{
}
int sentence::readanalyse()//输入函数分析
{
	int type=1,tag=0;
	while(type)
	{
		type=GetWord();
		switch(number)
		{
		case 27:if(tag==0)
					tag=1;
			    else
				{
					;//error
				}
				break;
		case ID:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					if(IsVar(name)==-1)
					{
						ReadError(1);
						;//error
					}
					else
					{
						CodeFile<<"code"<<++codenum<<": RED "<<depth-var_con_info.level<<", "<<var_con_info.address<<endl;
					}
					tag=2;
				}
				else
				{
					;//error
				}
				break;
		case 30:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					;//error
				}
				else if(tag==2)
				{
					tag=1;
				}
				else
				{
					;//error
				}
				break;
		case 28:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					;//error
				}
				else if(tag==2)
				{
					GetWord();
					cout<<endl<<"read finish"<<endl;//////////////////
					return 1;
				}
				break;
		}
	}
	return 1;
}
void sentence::ReadError(int tag)//输入函数分析错误处理
{
	errornum++;
	switch(tag)
	{
	case 1:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<":"<<"标识符 "<<name<<" 不能用作输入变量!"<<endl;
		   break;
	}
}
int sentence::writeanalyse()//输出函数分析
{
    int type=1,tag=0,varright,constright;
	while(type)
	{
		type=GetWord();
		switch(number)
		{
		case 27:if(tag==0)
					tag=1;
			    else
				{
					;//error
				}
				break;
		case ID:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					constright=IsConst(name);
					varright=IsVar(name);
					if(varright==-1&&constright==-1)
					{
						cout<<name<<endl;getch();
						cout<<"WRITE ERROR"<<endl;/////////////
						;//error
					}
					else
					{
						if(varright!=-1)
							CodeFile<<"code"<<++codenum<<" :LOD "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
						else
					    	CodeFile<<"code"<<++codenum<<": LIT 0,"<<constptr[var_con_info.address].value<<endl;
						CodeFile<<"code"<<++codenum<<": WRT 0,0"<<endl;
					}
					tag=2;
				}
				else
				{
					;//error
				}
				break;
		case 30:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					;//error
				}
				else if(tag==2)
				{
					tag=1;
				}
				else
				{
					;//error
				}
				break;
		case 28:if(tag==0)
				{
					;//error
				}
			    else if(tag==1)
				{
					;//error
				}
				else if(tag==2)
				{
					;//read 代码生成
					GetWord();
					cout<<endl<<"write finish"<<endl;//////////////////
					return 1;
				}
				break;
		}
	}
	return 1;
}
void sentence::WriteError(int tag)//输出函数分析错误处理
{
}
int sentence::factoranalyse()//元素factor分析
{
	int type,var_right,const_right;
	BackWord();
	GetWord();//////////////////////////
	type=GetWord();
	if(type==0)
		return 0;
//	cout<<name<<endl;
	switch(number)
	{
	case ID://cout<<"id   "<<name<<endl;
		    var_right=IsVar(name);
			const_right=IsConst(name);
		    if(var_right==-1&&const_right==-1)
			{
				FactorError(0);
			//	cout<<name<<endl;getch();
			}
			else
			{
				if(var_right!=-1)
				{
					CodeFile<<"code"<<++codenum<<": LOD "<<depth-var_con_info.level<<','<<var_con_info.address<<endl;
				}
				else
				{
					CodeFile<<"code"<<++codenum<<": LIT 0,"<<constptr[var_con_info.address].value<<endl;
				}
			}
		    break;
	case NUMBER://cout<<"number   "<<name<<endl;
		        CodeFile<<"code"<<++codenum<<": LIT 0,"<<name<<endl;
		        break;
	case 27:expanalyse();
		    if(number!=28)
			{
				cout<<"factor exp error"<<endl;///////////////////////////////////
			}
		    break;
	default:return 0;
	}
//	cout<<"factor finish"<<endl;///////////////
	return 1;
}
void sentence::FactorError(int tag)//factor分析错误处理
{
	errornum++;
	switch(tag)
	{
	case 0:ErrorFile<<"行:"<<line<<"\t错误"<<errornum<<": 标识符 "<<name<<" 未定义!"<<endl;
		   break;
	}
}
int sentence::termanalyse()//term分析
{
	int type,oldnum=-1,value=1;
	while(1)
	{
    	if(factoranalyse()==1)
		{
        	type=GetWord();
			if(type==0||!(number==24||number==25))
			{
				//BackWord();
				value=1;
				break;
			}
			if(oldnum!=-1)
			{
				if(oldnum==24)
					CodeFile<<"code"<<++codenum<<": OPR 0,*"<<endl;
				else if(oldnum==25)
				{
					CodeFile<<"code"<<++codenum<<": OPR 0,/"<<endl;
				}
				oldnum=-1;
			}
			else
			{
		    	if(number==24||number==25)
				{
		 	    	oldnum=number;
				//	cout<<oldnum<<endl;getch();getch();
				}
				else
				{
					value=1;
					BackWord();
					break;
				}

			}
		}
    	else
		{
			;//error
			value=0;
			break;
		}
	}
	if(oldnum!=-1)
	{
		if(oldnum==24)
			CodeFile<<"code"<<++codenum<<": OPR 0,*"<<endl;
		else
		{
			CodeFile<<"code"<<++codenum<<": OPR 0,/"<<endl;
		}
	}
	if(value==0)
	{
		cout<<"term error"<<endl;
	}
	else
	{
		cout<<"trem finish"<<endl;
	}
	return value;
}
void sentence::TermError(int tag)//term分析错误处理
{
}
int sentence::expanalyse()//exp分析
{
	int type,tag=0,time,num=-1,oldnum=-1,value;
	type=GetWord();
	if(type==0)
		return 0;
	if(!(number==22||number==23))
	{
		BackWord();
	}
	else
	{
		num=number;
	}
	while(1)
	{
		switch(tag)
		{
		case 0:value=termanalyse();
			   tag=1;
			   if(oldnum==22)
				   CodeFile<<"code"<<++codenum<<": OPR 0,+"<<endl;
			   else if(oldnum==23)
				   CodeFile<<"code"<<++codenum<<": OPR 0,-"<<endl;
			   oldnum=-1;
			   break;
		case 1:if(number==22||number==23)
			   {	   
				   tag=0;
				   oldnum=number;
			   }
			   else
			   {
				   if(number>=PROGRAM&&number<=ODD)
					   BackWord();
				   if(num==22)
			    	   CodeFile<<"code"<<++codenum<<": OPR 0,$+"<<endl;
			        else if(num==23)
				       CodeFile<<"code"<<++codenum<<": OPR 0,$-"<<endl;
					cout<<"exp finish"<<endl;
				   return 1;
			   }
			   break;
		}
	}
	if(num==22)
		CodeFile<<"code"<<++codenum<<": OPR 0,$+"<<endl;
    else if(num==23)
	    CodeFile<<"code"<<++codenum<<": OPR 0,$-"<<endl;
	if(value==0)
		cout<<" exp error"<<endl;
	else
		cout<<" exp finish"<<endl;
	return value;
}
void sentence::ExpError(int tag)//exp分析错误处理
{
}
int sentence::lexpanalyse()//lexp分析
{
	int type,value;
	char opr[3];
	type=GetWord();
	if(type==0)
		return 0;
	if(number==ODD)
	{
		value=expanalyse();
		CodeFile<<"code"<<++codenum<<": OPR 0,odd"<<endl;
	}
	else
	{
		BackWord();//回朔文件指针
    	if(expanalyse()==1)
		{
			if(number>15&&number<22)//= ,<>,<,<=,>,>=
			{
				strcpy(opr,name);
				value=expanalyse();
				if(value==1)
				{
					CodeFile<<"code"<<++codenum<<": OPR 0,"<<opr<<endl;
				}
			}
			else
			{
				;//error
		//		cout<<"lexp error"<<endl;getch();
			}
		}
		else
			value=0;
	}
	if(value==0)
	{
		cout<<"lexp error"<<endl;
	}
	else
		cout<<"lexp finish"<<endl;
	return value;
}
void sentence::LexpError(int tag)//lexp分析错误处理
{
}

⌨️ 快捷键说明

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