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

📄 kld01dlg.cpp

📁 用EVC4.0实现的一种类似于BASIC的编程语言,可以实现基本的编程并可以执行
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					int intemp=ParTable.parvalueStr[p2].GetLength();
					if (intemp>=t2)
					{	
						tempSTR=ParTable.parvalueStr[p2].Mid(t1-1,t2);
						VarTable.varvalueStr[VarIndex1]=tempSTR;
					}
					else 
					{
						toerr(i,0,20);return -1;	
					}
				}
				else
				{
					toerr(i,0,11);return -1;
				}
			}
		}
		
		else if (Rbt4IC[i].codename=="LEFT"||Rbt4IC[i].codename=="RIGHT")
		{	
			int t,index3, p3;
			Rbt4IC[i].PAR[1].MakeUpper();							//第一参数应为变量
			ParTable.parmaxnum =-1;									//参数表清空
			int p2=CreateParTable(Rbt4IC[i].PAR[2]);				//第二参数进表回返位置				
			int index2=ParTable.parstyle[p2];						//得到参数类型
			
			bool BDS=TestEXP(Rbt4IC[i].PAR[3]);						//检查是否为表达式

			if (BDS==true)											//表达式
			{
				t=int(Analyse(Rbt4IC[i].PAR[3]));					//表达式计算
				index3=1;
			}
			else
			{
				p3=CreateParTable(Rbt4IC[i].PAR[3]);
				t=int(ParTable.parvalueDouble[p3]); 
				index3=ParTable.parstyle[p3];						//得到参数类型
			}	
			int VarIndex1=searchVar(Rbt4IC[i].PAR[1]);				//第一参数不为变量,错误	
			if (VarIndex1==-1) 
			{
				toerr(i,0,12);return -1;
			}
			else					
			{
				CString tempSTR;
				if (VarTable.varstyle[VarIndex1]==0&&index2==0&&index3!=0)
				{
					int intemp=ParTable.parvalueStr[p2].GetLength();
					if (intemp>=t)
					{
						if (Rbt4IC[i].codename=="LEFT")
						
							tempSTR=ParTable.parvalueStr[p2].Left(t);
						else if (Rbt4IC[i].codename=="RIGHT")
							tempSTR=ParTable.parvalueStr[p2].Right(t);
						VarTable.varvalueStr[VarIndex1]=tempSTR;
					}
					else 
					{
						toerr(i,0,20);return -1;	
					}
				}
				else
				{
					toerr(i,0,11);return -1;
				}
			}
		}
		
		else if (Rbt4IC[i].codename=="RETURN")
		{
			if (Rbt4IC[i].parlength!=0)								//无参数,直接返回调用宏
			{
				int p=searchVar("RETVAL");
				CString temp1=Rbt4IC[i].PAR[1];						//取参数
				bool BDS=TestEXP(temp1);							//检查是否为表达式
				if (BDS==true)	
				{
					
					double t=Analyse(temp1);						//表达式计算
					if (EXPsymbol==1)			
					VarTable.varstyle[p]=EXPsymbol;					//写入返回值RETVAL变量
					VarTable.varvalueDouble[p]=t;
				}
				else
				{
					ParTable.parmaxnum =-1;	
					int p1=CreateParTable(temp1);
						
					VarTable.varstyle[p]=ParTable.parstyle[p1];		//写入返回值RETVAL变量
					VarTable.varvalueStr[p]=ParTable.parvalueStr[p1];
					VarTable.varvalueDouble[p]=ParTable.parvalueDouble[p1];
				}
			}
			break;
		}
		
		else if (Rbt4IC[i].codename=="ADD"||Rbt4IC[i].codename=="SUB"||Rbt4IC[i].codename=="MUL")
		{
			/*
			命令格式:ADD [变量P],[参数D] 
					  SUB [变量P],[参数D]
					  MUL [变量P],[参数D]
			
			变量P为变量
			参数D可以为变量或常量,进行运算后结果将保存到变量P中
			在ADD中若为字符串运算,则进行串连接后结果保存到变量P
			*/
			int VarIndex1=ParTest(i);								//参数预处理								
			if (VarTable.varstyle[VarIndex1]==ParTable.parstyle[1]&&ParTable.parstyle[1]==0)
			{
				VarTable.varvalueStr[VarIndex1]+=ParTable.parvalueStr[1];
			}
			else
			{
				double k1,k2;
				k1=VarTable.varvalueDouble[VarIndex1];
				k2=ParTable.parvalueDouble[1];
			
				if (Rbt4IC[i].codename=="ADD")
					k1=k1+k2;
				else if (Rbt4IC[i].codename=="SUB")
					k1=k1-k2;
				else if (Rbt4IC[i].codename=="MUL")
					k1=k1*k2;
				VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];//运算结果保存到变量中		
				VarTable.varvalueDouble[VarIndex1]=double(k1);
			}
		}	
		
		else if (Rbt4IC[i].codename=="UPPER"||Rbt4IC[i].codename=="LOWER")
		/*
			命令格式:UPPER [变量P]{,[参数D]} 
					  LOWER [变量P]{,[参数D]}		
			
			参数D可以省略
			变量P为字符串变量
			参数D可以为字符串变量或字符串,命令将参数D的内容转换为大写保存到变量P中
			若省略参数D,则变量P内容转换为大写
		  */
		{
			int VarIndex1,VarIndex2, p1;
			if (Rbt4IC[i].parlength!=0)									//参数不为空
			{
				CString temp1=Rbt4IC[i].PAR[1];							//取得第一参数
				temp1.MakeUpper();	
				VarIndex1=searchVar(Rbt4IC[i].PAR[1]);					//变量检查						
				if (Rbt4IC[i].parlength!=1)								//有第二参数?
				{
					CString temp2=Rbt4IC[i].PAR[2];						//取得第二参数
					ParTable.parmaxnum =-1;	
					p1=CreateParTable(temp2);							//进参数表
					VarIndex2=ParTable.parstyle[p1];					//取得数据类型
				}
				else
					VarIndex2=0;										//无第二参数,默认串型
				
				if (VarIndex1==-1||VarTable.varstyle[VarIndex1]!=0||VarIndex2!=0)
				{
					toerr(i,0,12);//第一参数不为变量,任何一个参数类型不是串型,错误
				}
					else
				{
					if (Rbt4IC[i].parlength!=1)			//两参数,第二参数送变量
						VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[p1];
					if (Rbt4IC[i].codename=="UPPER")	//实际转换	 
						VarTable.varvalueStr[VarIndex1].MakeUpper();  
					else 
						VarTable.varvalueStr[VarIndex1].MakeLower();
					
				}
			}
			else
			{
				toerr(i,0,2);return -1;
			}
		}
		else if (Rbt4IC[i].codename=="STRCMP")
		{
			CString temp1=Rbt4IC[i].PAR[1];
			temp1.MakeUpper();							
			CString temp2=Rbt4IC[i].PAR[2];
			temp2.MakeUpper();						
			ParTable.parmaxnum =-1;									//参数表清空
			int p1=CreateParTable(temp1);
			int p2=CreateParTable(temp2);							//第二参数进表回返位置
			int index1=ParTable.parstyle[p1];
			int index2=ParTable.parstyle[p2];						//得到参数类型
			int VarIndex1=searchVar(Rbt4IC[i].PAR[1]);				//第一参数不为变量,错误	
	
			if (index1!=index2||(index1==index2&&index1!=0))
			{
				toerr(i,0,13);
				return -1;
			}
			else
			{
				int p=searchVar("GI00");							//比较结果输出到GI00变量
				VarTable.varvalueDouble[p]=2;

			}
		}	
		
		else if (Rbt4IC[i].codename=="DIV")
		{
			int VarIndex1=ParTest(i);								//参数预处理								
			double k1,k2;
			k1=VarTable.varvalueDouble[VarIndex1];
			k2=ParTable.parvalueDouble[1];
			if (int(ParTable.parvalueDouble[1])==0)
			{
				toerr(i,0,14);return -1;
			}
			else
			{
				k1=k1/k2;
		
				VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];		
				VarTable.varvalueDouble[VarIndex1]=double(k1);
			}
		}	
		
		else if (Rbt4IC[i].codename=="CALL")
		{
			if (macdefinesymbol==true)						//宏定义模式
			{	
				if (searchMacro(Rbt4IC[i].PAR[1])!=-1)
				{
					mytemp.Format("执行宏指令%s\r\n",Rbt4IC[i].PAR[1]);
					m_f+=mytemp;
					RunMacro(Rbt4IC[i].PAR[1]);			//调用该宏
				}
				else
				{
					toerr(i,0,10);
					return -1;
				}
			}
		}

		else if (Rbt4IC[i].codename=="SIN"||Rbt4IC[i].codename=="COS"||Rbt4IC[i].codename=="TAN"
			||Rbt4IC[i].codename=="ATN")
		{
			int VarIndex1=ParTest(i);								//参数预处理
			double k1,k2;

			k1=VarTable.varvalueDouble[VarIndex1];
			k2=ParTable.parvalueDouble[1];
			if (Rbt4IC[i].codename=="SIN")
				k1=sin(k2);
			else if (Rbt4IC[i].codename=="COS")
				k1=cos(k2);
			else if (Rbt4IC[i].codename=="TAN")
				k1=tan(k2);
			else if (Rbt4IC[i].codename=="ATN")
				k1=atan(k2);	
		
			VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];		
			VarTable.varvalueDouble[VarIndex1]=double(k1);
		}	
		
		else if (Rbt4IC[i].codename=="FOR")
		{
			int errone=AddNewCyc(Rbt4IC[i].PAR[1], i);
			if (errone==-1) return -1;
		
		}
		else if (Rbt4IC[i].codename=="NEXT")
		{
			CycShed.cycnext[CycShed.cycmaxnum]=i; 
			int p=CycShed.cycplace[CycShed.cycmaxnum];					//取得变量位置
			CycShed.cycminvalue[CycShed.cycmaxnum]+=CycShed.cycstep[CycShed.cycmaxnum];	//加步长
			VarTable.varvalueDouble[p]=double(CycShed.cycminvalue[CycShed.cycmaxnum]);//结果回送到调用变量

			if (CycShed.cycstep[CycShed.cycmaxnum]>=0)
			{	
				if (CycShed.cycminvalue[CycShed.cycmaxnum]>CycShed.cycmaxvalue[CycShed.cycmaxnum])
					CycShed.cycmaxnum--;								//完成循环
				else
					i=CycShed.cyclineno[CycShed.cycmaxnum];				//循环未结束,继续
			}
			else
			{
				if (CycShed.cycminvalue[CycShed.cycmaxnum]<CycShed.cycmaxvalue[CycShed.cycmaxnum])
					CycShed.cycmaxnum--;								//完成循环
				else
					i=CycShed.cyclineno[CycShed.cycmaxnum];				//循环未结束,继续
				
			
			}
		}



		else if (Rbt4IC[i].codename=="AND"||Rbt4IC[i].codename=="OR"||Rbt4IC[i].codename=="XOR")
		{
			int VarIndex1=ParTest(i);								//参数预处理								
			long k1,k2;
			k1=long(VarTable.varvalueDouble[VarIndex1]);				//取得两参数
			k2=long(ParTable.parvalueDouble[1]);
			if (Rbt4IC[i].codename=="AND")							//相应运算
				k1=k1&k2;
			else if (Rbt4IC[i].codename=="OR")
				k1=k1|k2;
			else if (Rbt4IC[i].codename=="XOR")
				k1=k1^k2;
			VarTable.varvalueStr[VarIndex1]=ParTable.parvalueStr[1];//结果存变量		
			VarTable.varvalueDouble[VarIndex1]=double(k1);
		}	
		else												//非命令保留字,则为宏调用
		{	
			if (macdefinesymbol==true)						//宏定义模式
			{	
				int index1=searchMacro(Rbt4IC[i].codename);	//证明宏存在并取得宏的位置
				if (index1!=-1)
				{
					for (int pp=1;pp<=Rbt4IC[i].parlength;pp++)	//扫描参数表
					{
						ParTable.parmaxnum=0; 
						CString temp=MacroTable.partable[index1][pp-1];//取得宏参变量名
						int place=MacroTable.parplace[index1][pp-1];		//取得相应变量位置				
						int p1=CreateParTable(Rbt4IC[i].PAR[pp]);	//进表回返位置	
				
						if (ParTable.parstyle[p1]!=VarTable.varstyle[place]&&ParTable.parstyle[p1]==0)
						{
							toerr(i,1,13);return -1;
						}
						else
						{
							VarTable.varvalueStr[place]=ParTable.parvalueStr[p1];
							VarTable.varvalueDouble[place]=ParTable.parvalueDouble[p1];
						}

					}	
					
					
					
					
					//mytemp.Format("执行宏指令%s\r\n",Rbt4IC[i].codename);
					//m_f=m_f+mytemp;
					RunMacro(Rbt4IC[i].codename);			//调用该宏
				}
				else
				{
					toerr(i,0,10);break;
				}
				
			}
		}
		//
	}
	
	GetDlgItem(IDC_EDIT2)->SetWindowText(m_f); 
	CString temp="";
	int length=m_f.GetLength();	
	bool Plag=false,Plag1=false;

	for (int j=length-1;j>=0;j--)						//反向扫描串
	{
		bool plag=false;
												 
		if (j==0||m_f.GetAt(j)<=31)						//串扫描结束或者找到串首
		{
			temp=m_f.Right(length-j);					//保存该串作为命令字
			break;
		}				
	}	
	temp.TrimLeft();
	if (temp!="") m_f+="\r\n";
	this->GotoDlgCtrl(this->GetDlgItem(IDC_EDIT2));
	GetDlgItem(IDC_EDIT2)->SetWindowText(m_f); 
	return 0;
}

void CKld01Dlg::toerr(int linenum,int index,int errmode)
{
	CString temp,tt1;
	if (linenum>=0)
	{
		tt1.Format("第%d行:",linenum+1);
		if (errmode==9)
			temp=Rbt4IC[linenum].PAR[index];
		else if (errmode==6) 
			temp=MacroTable.macname[findendmac];
		else
			temp=Rbt4IC[linenum].codename;
		Rbt4IC[linenum].errline=linenum;					//发生错误的行号
		Rbt4IC[linenum].err=errmode;						//错误代码
	}	
	CString ErrMessage;
	err=errmode;
	
	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="没有匹配的ENDMAC";break;
	case 7:
		ErrMessage="没有匹配的MACRO";break;
	case 8:
		ErrMessage="没有匹配的跳转标号";break;
	case 9:
		ErrMessage="变量重复定义";break;
	case 10:
		ErrMessage="宏未定义";break;
	case 11:
		ErrMessage="参数类型不正确";break;
	case 12:
		ErrMessage="变量未定义";break;
	case 13:
		ErrMessage="命令变量类型不匹配";break;
	case 14:
		ErrMessage="除数为0";break;
	case 15:
		ErrMessage="所定义变量为内部保留变量";break;
	case 16:
		ErrMessage="中第一个参数必须为变量";break;
	case 17:
		ErrMessage="变量栈中重复定义";break;
	case 18:
		ErrMessage="FOR无匹配的NEXT";break;
	case 19:
		ErrMessage="NEXT无匹配的FOR";break;
	case 20:
		ErrMessage="参数过大";break;
	}

⌨️ 快捷键说明

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