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

📄 kld01dlg.cpp

📁 用EVC4.0实现的一种类似于BASIC的编程语言,可以实现基本的编程并可以执行
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	::MessageBox(NULL,tt1+temp+ErrMessage,"警告",MB_OK);
}

void CKld01Dlg::errcommand(int errmode)
{
	CString temp=RBTCMD.codename;
	CString ErrMessage;
	
	switch(errmode)
	{
	case 1:	
		ErrMessage="命令参数多于定义";break;
	case 2:
		ErrMessage="命令参数少于定义";break;
	case 3:
		ErrMessage="命令未定义";break;
	case 4:
		ErrMessage="宏未定义";break;
	case 5:
		ErrMessage="参数类型不正确";break;
	case 6:
		ErrMessage="变量未定义";break;
	case 7:
		ErrMessage="参数过大";break;
	}
	m_f+=ErrMessage+"\r\n";
	GetDlgItem(IDC_EDIT2)->SetWindowText(m_f); 
}



int CKld01Dlg::searchVar(CString temp)
{
	//temp.MakeUpper(); 
	temp.MakeUpper(); 
	for (int i=1;i<VarTable.varmaxnum+1;i++)
	{
		if (temp==VarTable.varname[i]) return i;			//找到变量,返回变量的位置								
	}
	return -1;												//否则说明表中无此变量,返回标志
}

int CKld01Dlg::CreateVarTable()
{
	int p;
	CString mytemp;
	
	for ( int i=0;i<MAXNUM;i++)								//全程序扫描
	{
		if (Rbt4IC[i].codename=="INT"||Rbt4IC[i].codename=="LONG"||Rbt4IC[i].codename=="FLOAT"||
			Rbt4IC[i].codename=="DOUBLE"||Rbt4IC[i].codename=="CSTRING")//变量定义命令
		{
			for (int j=1;j<Rbt4IC[i].parlength+1;j++)		//取得命令附加变量
			{
				p=CreateNewVar(i,j);
				if (p==-2) toerr(i,0,15);
				if (p!=-1)				//注册变量成功
				{
					//mytemp.Format("定义%s变量,类型%s\r\n",Rbt4IC[i].PAR[j],Rbt4IC[i].codename);
					//m_f=m_f+mytemp;	
					mytemp.Format("%s 类型是 %s",Rbt4IC[i].PAR[j],Rbt4IC[i].codename); 
					m_varIndex.AddString(mytemp);
					
				}
				else
				{
					toerr(i,j,9);return 9;
				}
			}
		}

	}
			
	
	return p;
}

int CKld01Dlg::CreateNewVar(int line,int varIndex)			//完成一个变量的注册
{
	CString temp=Rbt4IC[line].PAR[varIndex];
	temp.MakeUpper(); 
	for (int i=0;i<defineVarNum;i++)
	{
		if (temp==defineVar[i]) return -2;
	}
	int tempint=GetStyleCode(Rbt4IC[line].codename);		//设置变量类型码
	
	return AddNewVar(temp,tempint);							//以temp为名,类型为tempint创建一新的变量
}

void CKld01Dlg::MakePrint(int i)
{
	CString temp;
	bool plag=false;
	for (int i1=0;i1<Rbt4IC[i].parlength;i1++)				//扫描参数
	{	
		temp=Rbt4IC[i].PAR[i1+1];							//取参数
		if (i1==Rbt4IC[i].parlength-1) 
		{
			if (Rbt4IC[i].PAR[i1+1].Right(1) ==";")
			{
				temp.Replace(";",""); 
				plag=true;
			}
		
		}	

		bool BDS=TestEXP(temp);								//检查是否为表达式
		if (BDS==true)	
		{
		
			double t=Analyse(temp);							//表达式计算
			if (EXPsymbol==1)								//EXPsymbol表达式的返回数据类型=1,整型
				temp.Format(" %d",int(t));					//整型输出
			else if (EXPsymbol==2)							//长整型
				temp.Format(" %ld",long(t));
			else if (EXPsymbol==3)							//浮点型
				temp.Format(" %f",float(t));
			else if (EXPsymbol==4)							//双精度型
				temp.Format(" %.15f",double(t));		
			m_f+=temp;	
		}
		else
		{
			ParTable.parmaxnum =-1;								//参数表清空
			int p=CreateParTable(temp);							//参数进表
			if (p!=-1)
			{
				int pi=ParTable.parstyle[p];					//得到参数类型
				if (pi==0)										//字符串型
					temp=ParTable.parvalueStr[p]; 	
				else if (pi==1)
					temp.Format(" %d",int(ParTable.parvalueDouble[p]));	//整数型
				else if (pi==2)
					temp.Format(" %ld",long(ParTable.parvalueDouble[p]));//长整数型
				else if (pi==3)
					temp.Format(" %f",float(ParTable.parvalueDouble[p]));//浮点型
				else if (pi==4)
					temp.Format(" %.14f",ParTable.parvalueDouble[p]);//双精度型
				m_f+=temp;
			}
		}
	}	
	if (plag==false)m_f+="\r\n";
	GetDlgItem(IDC_EDIT2)->SetWindowText(m_f); 

}

void CKld01Dlg::MakeJumps(int i,CString temp1)
{
	int lineno;
	CString tempPar1,tempPar2;
	int VarIndex1,VarIndex2;
	int Myvarstyle1,Myvarstyle2;

		
	if (temp1=="JUMP")											//是转移指令
	{
		Rbt4IC[i].PAR[1].MakeUpper();							//转换为大写
		int p=searchJump(Rbt4IC[i].PAR[1]);
		if (p!=-1)
		{
			Rbt4IC[i].N[1]=JumpTable.jumpvalue[p];	
			lineno=Rbt4IC[i].N[1];								//跳转行号
		}	
	}
	else if (Rbt4IC[i].parlength ==3&&temp1.GetAt(0)=='J')
	{
		tempPar1=Rbt4IC[i].PAR[1];								//取得两个参数
		tempPar2=Rbt4IC[i].PAR[2];
		 
		ParTable.parmaxnum=-1; 
		VarIndex1=CreateParTable(tempPar1);						//加入参数表
		VarIndex2=CreateParTable(tempPar2);
		Myvarstyle1=ParTable.parstyle[VarIndex1]; 
		Myvarstyle2=ParTable.parstyle[VarIndex2]; 
		if (Myvarstyle1 !=Myvarstyle2&&(Myvarstyle1==0||Myvarstyle2==0)) toerr(i,0,13);			//变量类型不同错误
			
		Rbt4IC[i].PAR[3].MakeUpper();
		int p=searchJump(Rbt4IC[i].PAR[3]);
		if (p!=-1)
		{
			Rbt4IC[i].N[3]=JumpTable.jumpvalue[p];	
			lineno=Rbt4IC[i].N[3];								//跳转行号
		}	
		if (lineno==0) toerr(i,0,8);							//跳转=0,说明标号错误
	}
}

int CKld01Dlg::CreateParTable(CString temp)
{
	int VarIndex1;
	if (temp.GetAt(0)>='A'&&temp.GetAt(0)<='z')				//变量名则转换为大写
	{		
		temp.MakeUpper();
		VarIndex1=searchVar(temp);
		if (VarIndex1==-1)	
		{
			toerr(-1,0,12);
			return -1;										//扫描变量表,未找到则错误 
		}
		ParTable.parmaxnum++;								//是变量,从变量表中填写
		ParTable.parstyle[ParTable.parmaxnum]=VarTable.varstyle[VarIndex1];
		ParTable.parvalueStr[ParTable.parmaxnum]=VarTable.varvalueStr[VarIndex1];
		ParTable.parvalueDouble[ParTable.parmaxnum]=VarTable.varvalueDouble[VarIndex1];	
	}
	
	else if(temp.GetAt(0)>=48&&temp.GetAt(0)<=57||temp.GetAt(0)=='-')//数字常量
	{	
		ParTable.parmaxnum++;	
		ParTable.parvalueStr[ParTable.parmaxnum]="";
		ParTable.parvalueDouble[ParTable.parmaxnum]=atof(temp);


		if (temp.Right(1)=='#')							//浮点型
			ParTable.parstyle[ParTable.parmaxnum]=3;	
		else if (temp.Right(1)=='&')					//长整型
			ParTable.parstyle[ParTable.parmaxnum]=2;		
		else if (temp.Right(1)=='!')					//长整型
			ParTable.parstyle[ParTable.parmaxnum]=4;		
		else if (temp.Find(".",1)!=-1)
			ParTable.parstyle[ParTable.parmaxnum]=3;	//浮点型
		else
			ParTable.parstyle[ParTable.parmaxnum]=1;	//整型		
	}		
	else if(temp.GetAt(0)=='\"')						//字符串
	{
		ParTable.parmaxnum++;
		ParTable.parstyle[ParTable.parmaxnum]=0;
		temp.Replace("\"","");
		ParTable.parvalueStr[ParTable.parmaxnum]=temp;
		ParTable.parvalueDouble[ParTable.parmaxnum]=0.0;
		
	}
	else
	{
		toerr(-1,0,11);
		return -1;	
	}
	return ParTable.parmaxnum;
}

int CKld01Dlg::VarCmp(CString temp1, CString temp2)
{
	return 0;
}

void CKld01Dlg::MakeLet(int i)								//LET处理
{	
	Rbt4IC[i].PAR[1].MakeUpper();							//第一参数应为变量
	ParTable.parmaxnum =-1;									//参数表清空
	int p1=CreateParTable(Rbt4IC[i].PAR[1]);
	int index1=ParTable.parstyle[p1];						//得到参数类型				
	int VarIndex1=searchVar(Rbt4IC[i].PAR[1]);				//第一参数不为变量,错误	
	bool BDS=TestEXP(Rbt4IC[i].PAR[2]);						//检查是否为表达式

	if (BDS==true)											//表达式
	{

		if (VarIndex1!=-1)									//无错误,继续
		{
			if (VarTable.varstyle[VarIndex1]==ParTable.parstyle[1]&&ParTable.parstyle[1]==0)
				VarTable.varstyle[VarIndex1]=ParTable.parstyle[1];	//保存串型值到变量
			else
			{
				double t=Analyse(Rbt4IC[i].PAR[2]);			//表达式计算
			
				//////////////////////////////////////////////////////////////////////
				//CString temp="";								//此处只是后缀转换显示
				//for (i=1;i<=Postfix.PostfixIndex;i++)			//正式使用时删除
				//{
				//	temp1=Postfix.PostfixContent[i];
				//	temp+=temp1;
				//	if (i<Postfix.PostfixIndex-1) temp+=",";
				//}
				//m_f=m_f+temp+"\r\n";
				//UpdateData(false);
				//////////////////////////////////////////////////////////////////////
				
				if (EXPsymbol==1)								//根据变量数据类型重新得到数值								
					t=int(t);									//到整型变量	
				else if (EXPsymbol==2)									
					t=long(t);									//到长整型变量	
				else if (EXPsymbol==3)								
					t=float(t);									//到浮点型变量	
				else if (EXPsymbol==4)								
					t=double(t);								//到双精度型变量	

				VarTable.varvalueDouble[VarIndex1]=double(t);//保存到变量区
			}
			VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];	
		}
	}
	else
	{
		int VarIndex1=ParTest(i);								//参数预处理								
		if (VarIndex1!=-1)										//无错误,继续
		{
			if (VarTable.varstyle[VarIndex1]==ParTable.parstyle[1]&&ParTable.parstyle[1]==0)
				VarTable.varstyle[VarIndex1]=ParTable.parstyle[1];	//保存串型值到变量
			else
			{	
				double t;
				if (index1==1)									//根据变量数据类型重新得到数值								
					t=int(ParTable.parvalueDouble[1]);			//到整型变量	
				else if (index1==2)									
					t=long(ParTable.parvalueDouble[1]);			//到长整型变量	
				else if (index1==3)								
					t=float(ParTable.parvalueDouble[1]);		//到浮点型变量	
				else if (index1==4)								
					t=double(ParTable.parvalueDouble[1]);		//到双精度型变量index1
			
				VarTable.varvalueDouble[VarIndex1]=t;			//数值型到变量		
			
			}
			VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];	
		}
		
	
	}
}

int CKld01Dlg::ParTest(int i)								//参数测试
{
	Rbt4IC[i].PAR[1].MakeUpper();							//第一参数应为变量
	ParTable.parmaxnum =-1;									//参数表清空
	int VarIndex1=searchVar(Rbt4IC[i].PAR[1]);				//第一参数不为变量,错误	
	if (VarIndex1==-1) 
	{
		toerr(i,0,12);
	}
	else
	{
		int p1=CreateParTable(Rbt4IC[i].PAR[1]);
		int p2=CreateParTable(Rbt4IC[i].PAR[2]);			//第二参数进表回返位置
		int index1=ParTable.parstyle[p1];					//得到参数类型
		int index2=ParTable.parstyle[p2];					//得到参数类型
	}
	

	return VarIndex1;										//返回变量位置

}

int CKld01Dlg::AddNewVar(CString VarName,int varstyle)		//以指定
{
	VarName.MakeUpper(); 
	int p=searchVar(VarName);
	if (p==-1)
	{
		VarTable.varmaxnum++;								//变量数+1
		VarTable.varname[VarTable.varmaxnum]=VarName;		//登记变量名	
		VarTable.varstyle[VarTable.varmaxnum]=varstyle;		//登记变量类型
		VarTable.varvalueStr[VarTable.varmaxnum]="";		//初始化	
		VarTable.varvalueDouble[VarTable.varmaxnum]=0.0; 
		
		return VarTable.varmaxnum;
	}
	else
		return -1;
}

int CKld01Dlg::ParCmp(int i, CString CommandName)
{
	/*条件转移处理,i为程序行序号,CommandName为条件转移的指令名*/
	ParTable.parmaxnum =-1;	
	int p1=CreateParTable(Rbt4IC[i].PAR[1]);
	int p2=CreateParTable(Rbt4IC[i].PAR[2]);	//第二参数进表回返位置
	/*int index1=ParTable.parstyle[p1];
	int index2=ParTable.parstyle[p2];			//得到参数类型
	if (index1!=index2 && (index1==0||index2==0))//参数类型不同且参数中有一个为串型,错误
	{
		toerr(i,0,12);
		return -1;
			
	}
	else*/
	{	
		if (Rbt4IC[i].codename=="JNE")			//参数不相等
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]!=ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JEQ")		//参数相等
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]==ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JLT")		//参数1<参数2
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]<ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JLTE")	//参数1<=参数2
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]<=ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JGT")		//参数1>参数2
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]>ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JGTE")	//参数1>=参数2
		{
			if (ParTable.parstyle[p1]==0&&ParTable.parstyle[p2]==0)
				return ParTable.parvalueStr[p1]!=ParTable.parvalueStr[p2];
			else 
				return ParTable.parvalueDouble[p1]>=ParTable.parvalueDouble[p2];
		}
		else if (Rbt4IC[i].codename=="JAND")	////参数 and 参数2
			return long(ParTable.parvalueDouble[p1])&long(ParTable.parvalueDouble[p2]);
		else if (Rbt4IC[i].codename=="JOR")		//参数 or 参数2
			return long(ParTable.parvalueDouble[p1])|long(ParTable.parvalueDouble[p2]);
		else 									//参数 xor 参数2
			return long(ParTable.parvalueDouble[p1])^long(ParTable.parvalueDouble[p2]);

		/*	比较结果为真返回1,结果为假返回0*/
	}	
}

int CKld01Dlg::searchcycshed(CString ShedName)
{
	

⌨️ 快捷键说明

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