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

📄 exptoken.cpp

📁 一个简单实现了词法分析
💻 CPP
字号:
#include "stdafx.h"
#include "stdio.h"
#include "string.h"
#include "ExpToken.h"

EToken::EToken()
{
	strcpy(ETokenLeft,"");
	ETokenOp_1=' ';
	ETokenRN_1=0;
	ETokenRN_2=0;
	ETokenR_Op_1='+';
	strcpy(ETokenR_1,"");
	strcpy(ETokenR_2,"");
	strcpy(ETokenEnd,"");
	ETokenKind=0;

}/*
EToken::EToken(const EToken& P)
{
	strcpy(ETokenLeft,P.ETokenLeft);
	ETokenOp_1=P.ETokenOp_1;
	ETokenRN_1=P.ETokenRN_1;
	ETokenRN_2=P.ETokenRN_2;
	ETokenR_Op_1=ETokenR_Op_1;
	ETokenKind=P.ETokenKind;
	strcpy(ETokenR_1,P.ETokenR_1);
	strcpy(ETokenR_2,P.ETokenR_2);
	strcpy(ETokenEnd,P.ETokenEnd);	
}*///拷构不可乱添
void EToken::IniEToken()
{
	EToken();
}
ETokenMan::ETokenMan()
{
	CToken_Index=0;
}
ETokenMan::~ETokenMan()
{}
int ETokenMan::GenExpToken(CTokens *T,EToken *PEToken)
{
//	void CTokens::GetToken(CToken* pToken,int index)
//{
//	*pToken=TokenV[index];
//}
	 
	CToken ET;
	CToken* EToken_Node=&ET;
	int len1=T->GetTokenNum();
	T->GetToken(EToken_Node,CToken_Index);	
	if(strcmp(EToken_Node->CTokenName,"program")==0)
	{
		strcpy(PEToken->ETokenLeft,"program");
		strcpy(PEToken->ETokenEnd,"#");		
		CToken_Index++;
		PEToken->ETokenKind=1;
		ExpStack.push_back(*PEToken);
		return 1;//#program
	}
	if(strcmp(EToken_Node->CTokenName,"var")==0)
	{
		CToken_Index++;
		T->GetToken(EToken_Node,CToken_Index);
		if(EToken_Node->CTokenChar==':')
		{
			strcpy(PEToken->ETokenLeft,"var");
			strcpy(PEToken->ETokenEnd,":");			
			CToken_Index++;
			PEToken->ETokenKind=2;
			ExpStack.push_back(*PEToken);
			return 2;//#var #:
		}
		return 0;
	}
	if(strcmp(EToken_Node->CTokenName,"end")==0 )//&& CToken_Index<len1
	{
		strcpy(PEToken->ETokenLeft,"end");
		CToken_Index++;
		T->GetToken(EToken_Node,CToken_Index);
		PEToken->ETokenKind=8;
		ExpStack.push_back(*PEToken);
		return 8;//end
	}
	else
	{
		 
		
	 	if(EToken_Node->CTokenChar !=';')
		{	
			strcpy(PEToken->ETokenLeft,EToken_Node->CTokenName);//注意编辑器中的Tab容易被当成左部.
			
			CToken_Index++;
			T->GetToken(EToken_Node,CToken_Index);
			PEToken->ETokenOp_1=EToken_Node->CTokenChar;//read operator token

			CToken_Index++;
			T->GetToken(EToken_Node,CToken_Index);
			if(EToken_Node->CTokenkind==4)
			{
				PEToken->ETokenRN_1=EToken_Node->CTokenValue;

				CToken_Index++;
				T->GetToken(EToken_Node,CToken_Index);
				if(EToken_Node->CTokenChar==';')
				{
					CToken_Index++;
					T->GetToken(EToken_Node,CToken_Index);
					PEToken->ETokenKind=3;
					ExpStack.push_back(*PEToken);
					return 3;//x1=3;
				}
				if(EToken_Node->CTokenkind==1)
				{
					PEToken->ETokenR_Op_1=EToken_Node->CTokenChar;					 
					CToken_Index++;
					T->GetToken(EToken_Node,CToken_Index);
					
					if(EToken_Node->CTokenkind==4)
					{
						PEToken->ETokenRN_2=EToken_Node->CTokenValue;
						CToken_Index++;
						T->GetToken(EToken_Node,CToken_Index);
						if(EToken_Node->CTokenChar==';')
						{
							CToken_Index++;
							T->GetToken(EToken_Node,CToken_Index);
							PEToken->ETokenKind=4;							 
							ExpStack.push_back(*PEToken);
							return 4;//x1=3+3;
						}
					}
					if(EToken_Node->CTokenkind==3)
					{
						strcpy(PEToken->ETokenR_2,EToken_Node->CTokenName);
						CToken_Index++;
						T->GetToken(EToken_Node,CToken_Index);
						if(EToken_Node->CTokenChar==';')
						{
							CToken_Index++;
							T->GetToken(EToken_Node,CToken_Index);
							PEToken->ETokenKind=9;
							ExpStack.push_back(*PEToken);
							return 9;//x1=2+x3;
						}

					}
					 					
				}
			}
			if(EToken_Node->CTokenkind==3)
			{
				strcpy(PEToken->ETokenR_1,EToken_Node->CTokenName);					
				CToken_Index++;
				T->GetToken(EToken_Node,CToken_Index);
				if(EToken_Node->CTokenChar==';')
					{
						CToken_Index++;
						T->GetToken(EToken_Node,CToken_Index);
						PEToken->ETokenKind=5;
						ExpStack.push_back(*PEToken);
						return 5;//x1=x2;
					}
				PEToken->ETokenR_Op_1=EToken_Node->CTokenChar;
				CToken_Index++;
				T->GetToken(EToken_Node,CToken_Index);
				if(EToken_Node->CTokenkind==4)
				{
					PEToken->ETokenRN_2=EToken_Node->CTokenValue;
					CToken_Index++;
					T->GetToken(EToken_Node,CToken_Index);
					if(EToken_Node->CTokenChar==';')
					{
						CToken_Index++;
						T->GetToken(EToken_Node,CToken_Index);
						PEToken->ETokenKind=6;
						ExpStack.push_back(*PEToken);
						return 6;//x1=x2+3;
					}
				}
				else
				{
					strcpy(PEToken->ETokenR_2,EToken_Node->CTokenName);
					CToken_Index++;
					T->GetToken(EToken_Node,CToken_Index);
					if(EToken_Node->CTokenChar==';')
					{
						CToken_Index++;
						T->GetToken(EToken_Node,CToken_Index);
						PEToken->ETokenKind=7;
						ExpStack.push_back(*PEToken);
						return 7;//x1=x2+x3;
					}
				}

			}


		}
	}
	
	return 0;
}
int ETokenMan::GetExp(CTokens* TT)
{
//int ETokenMan::GenExpToken(EToken *PEToken,ETokenMap *PETokenM)
	
	EToken Tm; 
	EToken* TmpEToken=&Tm;
	//TmpEToken->IniEToken(); 
	//CTokens TT;	 
	int len=TT->GetTokenNum();	
	int i=CToken_Index;	
	int j=0;
	while(i<len+1)
	{
		j=GenExpToken(TT,TmpEToken);
		switch(j)
		{
			case 1:
				{
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<endl;
				//	ExpStack.push_back(*TmpEToken);
					break;
				}
			case 2:
				{
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<endl;
				//	ExpStack.push_back(*TmpEToken);
					break;
				}
			case 3:
				{
				//  ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenRN_1<<" ";
					cout<<endl;
					break;
				}
			case 4:
				{
				//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenRN_1<<" ";
					cout<<TmpEToken->ETokenR_Op_1<<" ";
					cout<<TmpEToken->ETokenRN_2<<" ";
					cout<<endl;
					break;
				}
			case 5:
				{
				//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenR_1<<" ";
					cout<<endl;
					break;
				}
			case 6:
				{
				//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenR_1<<" ";
					cout<<TmpEToken->ETokenR_Op_1<<" ";
					cout<<TmpEToken->ETokenRN_2<<" ";
					cout<<endl;
					break;
				}
			case 7:
				{
				//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenR_1<<" ";
					cout<<TmpEToken->ETokenR_Op_1<<" ";
					cout<<TmpEToken->ETokenR_2<<" ";
					cout<<endl;
					break;
				}
			case 8:
				{
				//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<endl;
					break;
				}
			case 9:
				{
			 	//	ExpStack.push_back(*TmpEToken);
					cout<<TmpEToken->ETokenLeft<<" ";
					cout<<TmpEToken->ETokenOp_1<<" ";
					cout<<TmpEToken->ETokenRN_1<<" ";
					cout<<TmpEToken->ETokenR_Op_1<<" ";
					cout<<TmpEToken->ETokenR_2<<" ";
					cout<<endl;
					break;
				}
		}
		 
		i=CToken_Index;
		 
		
	}
	return 1;
	
}
int ETokenMan::GetExpNum()
{
	int lenExp=0;
	lenExp=ExpStack.size();
	return lenExp;
}
//----------------------------------------------------------
CVarToken::CVarToken()
{	
	strcpy(VarName,"");
	VarValue=0;
}
int CVarMan::GenVarStack(CTokens* T)
{//void GetToken(CToken* pToken,int index);int GetTokenNum();
	CToken TmpV;
	CVarToken TmpVar;
	int lenV=0;
	int i=0; 
	lenV=T->GetTokenNum();
	while(i<lenV)
	{
		T->GetToken(&TmpV,i);
		if(TmpV.CTokenkind==3)
		{		
			strcpy(TmpVar.VarName,TmpV.CTokenName);
			VarStack.push_back(TmpVar);
		}
		i++;
	} 
	return 1;	 
}
int CVarMan::CleanStack()
{
	int j=0;
	int t=0;
	while(j<VarStack.size())
	{	
		int k=j;
		t=j+1;
		while(t<VarStack.size()&&strlen(VarStack[k].VarName)!=0)
		{
			int tt=9;			 
			char str[10]="";
			char str1[10]="";
			strcpy(str,VarStack[t].VarName);
			strcpy(str1,VarStack[k].VarName);
			tt=strcmp(str1,str);		 
			if(tt==0)
			{
				if(strlen(VarStack[t].VarName)!=0)
				{
					strcpy(VarStack[t].VarName,"");
					VarStack[k].VarValue=0;
				}
			}
		 
			t++;
		}
		j++;
	}
	return 1;
}
int CVarMan::QueryVstack(char* VarN)
{
	int i_V=3;
	int Var_Index=0;	
	int lenVS1=VarStack.size();
	while(Var_Index<lenVS1)
	{
		i_V=strcmp(VarN,((VarStack[Var_Index]).VarName));
		if(i_V==0)
		{
			return ((VarStack[Var_Index]).VarValue);
		}
		Var_Index++;
	}

	return 0;
}
int CVarMan::PutInValue(char* VarN,double* VarVal)
{
	int i_V1=3;	
	int lenVS=VarStack.size();
	for(int i=0;i<lenVS;i++)
	{
		char str[10]="";
		strcpy(str,((VarStack[i]).VarName));
		i_V1=strcmp(VarN,str);
		if(i_V1==0)
		{

			VarStack[i].VarValue=*VarVal;
			 
		}
	}
	return 1;
}
int CVarMan::GetVarStackLgth()
{
	int LenG=0;
	LenG=VarStack.size();
	return LenG;
}
int CVarMan::PrintVarS()
{
	int lenVST=0;
	lenVST=VarStack.size();
	for(int i=0;i<lenVST;i++)
	{
		if(strlen(VarStack[i].VarName)!=0)
		{
			cout<<"(";
			cout<<VarStack[i].VarName<<" ";
			cout<<VarStack[i].VarValue;
			cout<<")";
			cout<<endl;
		}
	}
	return 1;
}
double CVarMan::ExpOpMan( char* op,char* PCVar,double P2,double P3)
{
	double P1=0;
	if((*op)=='+')
	{
		(P1)=P2+P3;		 
	}
	if((*op)=='-')
	{
		(P1)=(P2)-(P3);
	}
	if((*op)=='*')
	{
		(P1)=(P2)*(P3);		
	}
	if((*op)=='/')
	{
		(P1)=(P2)/(P3);	
	}
	if((*op)=='=')
	{
		(P1)=(P2);
	}
	PutInValue(PCVar,&P1);
	return 0;

}
int CVarMan::ManAExp(EToken* TE)
{
	double* Tmp_P1=0;
	int j=0;
	j=TE->ETokenKind;
	switch(j)
	{
	case 1: //#program
		{
			break;
		}
	case 2: //#var
		{
			break;
		}
	case 8: //end
		{
			break;
		}
	case 3: //x1=3
		{
			ExpOpMan(&TE->ETokenOp_1,TE->ETokenLeft,(double)TE->ETokenRN_1,0);
			break;
		}
	case 4://x1=3+3;
		{
			//char Name[10]="";&TE->ETokenR_Op_1 		 			 
			ExpOpMan(&(TE->ETokenR_Op_1),TE->ETokenLeft,(double)TE->ETokenRN_1,(double)TE->ETokenRN_2);
			//ExpOpMan(TE->ETokenOp_1,TE->ETokenLeft,(double)TE->ETokenRN_1,(double)TE->ETokenRN_2);
			break;
		}
	case 5://x1=x2;
		{
			double tmp=QueryVstack(TE->ETokenR_1);
			ExpOpMan(&TE->ETokenOp_1,TE->ETokenLeft,tmp,0);
			break;
		}
	case 6://x1=x2+3;
		{
			double tmp1=QueryVstack(TE->ETokenR_1);	
			ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,tmp1,TE->ETokenRN_2);
			break;
		}
	case 7://x1=x2+x3;
		{	
			double tmp2=QueryVstack(TE->ETokenR_1);	
			double tmp3=QueryVstack(TE->ETokenR_2);	
			ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,tmp2,tmp3);
			break;
		}
	case 9://x1=2+x3;
		{
			double tmp4=QueryVstack(TE->ETokenR_2);	
			ExpOpMan(&TE->ETokenR_Op_1,TE->ETokenLeft,TE->ETokenRN_1,tmp4);
			break;
		}
	default:
		return 0;

	}
	return 1;
}

int CVarMan::GenFinalES(ETokenMan* TEM )
{
	EToken TMP;
	int EXP_INDex=0;
	int len_VS=0;
	len_VS=VarStack.size();
	CleanStack();
	while(EXP_INDex<len_VS)
	{
		ManAExp(&(TEM->ExpStack[EXP_INDex]));
		EXP_INDex++;
	}
	return 1;
}
int CVarMan::GenERVar()
{
	return 1;

}






⌨️ 快捷键说明

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