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

📄 kld01dlg.cpp

📁 用EVC4.0实现的一种类似于BASIC的编程语言,可以实现基本的编程并可以执行
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		//取出第一个宏作为执行宏	
		if (macdefinesymbol==true)				//是否是代码串指令,FALSE=代码串,TRUE=宏代码方式
		{
			RunMacro(MacroTable.macname[1]);			//宏代码执行
		}
		else
		{
			RunCommand(0,MAXNUM-1);						//代码串执行

		}
		this->GetDlgItem(IDC_RUN)->SetWindowText("解释代码");
		RUNTTING=false;
		BREAKPOINT=false;
	}
	
	GetDlgItem(IDC_EDIT2)->SetWindowText(m_f);
}
else
{
	BREAKPOINT=true;
	//::MessageBox(NULL,"    代码正在执行,请稍侯…\r\n可以用ESC键或者Q键中断执行","警告",MB_OK);
}

}
		
int CKld01Dlg::searchMacro(CString temp)
{
	temp.MakeUpper(); 
	for (int i=1;i<MacroTable.macmaxnum+1;i++)
	{
		if (temp==MacroTable.macname[i]) return i;		//找到宏,返回宏的位置	
								
	}
	return -1;
}

void CKld01Dlg::RunMacro(CString MacroName)
{		
	int p=searchVar("RETVAL");							//将返回值初始化
	
	VarTable.varstyle[p]=1; 
	VarTable.varvalueStr[p]=""; 
	VarTable.varvalueDouble[p]=0.0;

	
	int MacroIndex=searchMacro(MacroName);				//得到宏指令位置编号
	if (MacroIndex!=-1)
	{
		int i1=MacroTable.macstart[MacroIndex];			//取得宏首尾区段
		int i2=MacroTable.macend[MacroIndex];	
	
		RunCommand(i1,i2);								//运行该段代码			
	}
}

int CKld01Dlg::CreateNewMacro(int NameIndex)			//建立新的宏
{
	CString mytemp;
	Rbt4IC[NameIndex].PAR[1].TrimLeft();
	Rbt4IC[NameIndex].PAR[1].MakeUpper();				//转换为大写
	if (searchMacro(Rbt4IC[NameIndex].PAR[1])==-1)		//扫描宏表查找该宏是否存在
	{	
		
		MacroTable.macmaxnum++;							//不存在,可建立
		MacroTable.macname[MacroTable.macmaxnum]= Rbt4IC[NameIndex].PAR[1];//宏名记录
		//  
		//TrimLeft.TrimRight();   		  
		MacroTable.macsymbol=0;							//已完成开始点定义,未完成结束点定义
		MacroTable.macstart[MacroTable.macmaxnum]= NameIndex;	
		MacroTable.parlength[MacroTable.macmaxnum]=Rbt4IC[NameIndex].parlength-1; //宏参数数量记录
		
		int VarIndex;
		CString temp1;
		CString temp2;
		for (int i1=0;i1<Rbt4IC[NameIndex].parlength-1;i1++)
		{
			CString temp=Rbt4IC[NameIndex].PAR[i1+2];
			temp.MakeUpper(); 
			int l=temp.GetLength();						//求串长
			int p=temp.Find(":",1);						//有无类型定义	
			if (p==-1)									//无
			{
				VarIndex=searchVar(temp);				//查找变量	
				if (VarIndex==-1) 
				{
					toerr(i1,0,12);						//未找到,错误
					return -1;
				}
				temp1=temp;								//找到,记录变量名

			}
			else
			{
				temp1=temp.Left(p);						//拆分类型和变量名
				temp2=temp.Right(l-p-1);
				int varstyle=GetStyleCode(temp1);		//将类型转化为编码
			

				VarIndex=AddNewVar(temp2,varstyle);
				if (VarIndex==-1) 
				{
					toerr(i1,0,9);
					return -1;
				}
					//mytemp.Format("定义%s变量,类型%s\r\n",temp2,temp1);
				//m_f=m_f+mytemp;	
				mytemp.Format("%s 类型是 %s",temp2,temp1); 
				m_varIndex.AddString(mytemp);

			}

			MacroTable.partable[MacroTable.macmaxnum][i1]=temp2; //参变量名记录
			MacroTable.parstyle[MacroTable.macmaxnum][i1]=VarTable.varstyle[VarIndex];	//类型记录
			MacroTable.parplace[MacroTable.macmaxnum][i1]=VarIndex;	//参变量位置记录
		}
		MacroTable.macsymbol=0;
		macdefinesymbol=1;	//是否是立即指令,FALSE=单模块,TRUE=宏定义方式
		//至此完成宏的第一步
			
		return 0;
	}	
	
	else
	{
		return -1;
	}
}

int CKld01Dlg::searchJump(CString temp)
{
	//temp.MakeUpper(); 
	for (int i=1;i<JumpTable.jumpmaxnum+1;i++)
	{
		if (temp==JumpTable.jumpname[i]) return i;		//找到标号,返回标号的位置	
								
	}
	return -1;
}

int CKld01Dlg::CreateNewJump(int JumpIndex)
{
	Rbt4IC[JumpIndex].PAR[1].MakeUpper();
	if (searchJump(Rbt4IC[JumpIndex].PAR[1])==-1)	//检查跳转表是否已存在该名称
	{
		JumpTable.jumpmaxnum++; 
		JumpTable.jumpname[JumpTable.jumpmaxnum]= Rbt4IC[JumpIndex].PAR[1];	//记录标号名称
		JumpTable.jumpvalue[JumpTable.jumpmaxnum]=JumpIndex;
		JumpTable.jumpsymbol=0;						//-1:未开始jump定义, =0:完成记录
		
		return JumpTable.jumpmaxnum;				//返回当前数量
	}
	else
	{
		return -1;
	}
}

void CKld01Dlg::CreateJumpTable()					//建立跳转表
{
	CString mytemp;
	for (int i=0;i<MAXNUM;i++)
	{
		if (Rbt4IC[i].codename=="LABEL")
		{
			if (CreateNewJump(i)!=-1)				//注册成功
			{
				//mytemp.Format("执行LABEL表定义指令,参数:%s\r\n",Rbt4IC[i].PAR[1]);
				CString temp;
				temp.Format("%s      %d",JumpTable.jumpname[JumpTable.jumpmaxnum],JumpTable.jumpvalue[JumpTable.jumpmaxnum]); 
				
				//m_jumpIndex.AddString(JumpTable.jumpname[JumpTable.jumpmaxnum]);
				m_jumpIndex.AddString(temp);
				//m_f=m_f+mytemp;
				

			}
			else
			{
				toerr(i,0,5);						//重复定义
			}
		}
	}
}

void CKld01Dlg::OnSelchangeList4() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_RUNSELECTMACRO)->EnableWindow(true);
}

void CKld01Dlg::OnRunselectmacro() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	CString temp;
	temp=m_defMacroIndex;	//刷新变量读取
	RunMacro(temp);			//执行选定宏
	UpdateData(false);
}

int CKld01Dlg::RunCommand(int i1, int i2)
{
	CString mytemp;
	MSG	msg;
	for (int i=i1;i<=i2;i++)
	{
		if (BREAKPOINT==true)		
		{
			mytemp.Format("程序被强制中断运行,被中断指令:%s\r\n",Rbt4IC[i].codename); 
				m_f+=mytemp;
				return -1;
		}
		
		
		if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
		{
				
			TranslateMessage (&msg) ;
			DispatchMessage (&msg) ;
			if (msg.message == WM_KEYDOWN && msg.wParam == VK_ESCAPE||msg.wParam=='Q') 
			{	
				mytemp.Format("程序被强制中断运行,被中断指令:%s\r\n",Rbt4IC[i].codename); 
				m_f+=mytemp;	
				return -1; 
			}
		}
		
		if (Rbt4IC[i].codename=="ENDMAC") break;			//宏执行完成,中断执行
		if (Rbt4IC[i].codename=="MACRO"||Rbt4IC[i].codename=="LABEL"||Rbt4IC[i].codename=="INT"||Rbt4IC[i].codename=="REM")
			;
		else if (Rbt4IC[i].codename=="FLOAT"||Rbt4IC[i].codename=="LONG"||Rbt4IC[i].codename=="DOUBLE"||Rbt4IC[i].codename=="CSTRING") 
			;/*非执行指令*/
		else if (Rbt4IC[i].codename=="CC") 
		{
			mytemp.Format("执行%d轴CL指令,参数:%d\r\n",Rbt4IC[i].N[1],Rbt4IC[i].N[1]);
			m_f+=mytemp;
			
		}
		else if (Rbt4IC[i].codename=="CL") 
		{
			mytemp.Format("执行%d轴CL指令,参数:%d\r\n",Rbt4IC[i].N[1],Rbt4IC[i].N[1]);
			m_f+=mytemp;
			
		}
		else if (Rbt4IC[i].codename=="KL") 
		{
			mytemp.Format("执行%d轴KL指令,参数:%d\r\n",Rbt4IC[i].N[1],Rbt4IC[i].N[1]);
			m_f+=mytemp;
			
		}
			
		else if (Rbt4IC[i].codename=="SL")
		{
			mytemp.Format("执行%d轴SL指令,参数:%d\r\n",Rbt4IC[i].N[1],Rbt4IC[i].N[1]);
			m_f+=mytemp;
		
		}
		//条件转移处理
		else if (Rbt4IC[i].codename=="JNE"||Rbt4IC[i].codename=="JEQ"||Rbt4IC[i].codename=="JLT"||
		  Rbt4IC[i].codename=="JLTE"||Rbt4IC[i].codename=="JGT"	||Rbt4IC[i].codename=="JGTE"||
		  Rbt4IC[i].codename=="JOR"||Rbt4IC[i].codename=="JAND"||Rbt4IC[i].codename=="JXOR")
		{
			int p=searchJump(Rbt4IC[i].PAR[3]);			//扫描跳转表
			if (p!=-1)	
			{
				//mytemp.Format("执行%s指令,参数:%d\r\n",Rbt4IC[i].codename,Rbt4IC[i].N[1],Rbt4IC[i].N[3]);
				//m_f=m_f+mytemp;
				if (ParCmp(i, Rbt4IC[i].codename)==1)
				{	
					i=JumpTable.jumpvalue[p]; 
				}
			}
			else
			{
				toerr(i,0,8);return -1;
			}
		}
		
		else if (Rbt4IC[i].codename=="BREAK")				//结束循环
		{
			CString temp=CycShed.cycname[CycShed.cycmaxnum];
			int p=searchVar(temp);//CycShed.cycmaxnum 
			VarTable.varvalueDouble[p]=double(CycShed.cycminvalue[CycShed.cycmaxnum]);//结果回送到调用变量

			i=CycShed.cycnext[CycShed.cycmaxnum--];			//完成循环								
		
				
		}

		else if (Rbt4IC[i].codename=="JUMP")				//转移指令的处理
		{
			
			int p=searchJump(Rbt4IC[i].PAR[1]);				//扫描跳转表
			if (p!=-1)										//找到,执行跳转
			{
				//mytemp.Format("执行JUMP转移指令,参数:%s\r\n",Rbt4IC[i].PAR[1]);
				//m_f=m_f+mytemp;
				i=JumpTable.jumpvalue[p]; 
			}
			else
			{
				toerr(i,0,8);return -1;
			}
		
		}
		
		else if (Rbt4IC[i].codename=="PRINT")
		{
			MakePrint(i);
				
		}
		
		else if (Rbt4IC[i].codename=="INPUT")						//键盘输入指令
		{
			int VarIndex1,p1;
			CInputBox dlg;
			ParTable.parmaxnum =-1;									//参数表清空
			if (Rbt4IC[i].parlength ==1)
			{
				p1=CreateParTable("\"输入框\"");
				VarIndex1=searchVar(Rbt4IC[i].PAR[1]);			//第一参数不为变量,错误	
			}
			else if (Rbt4IC[i].parlength ==2)
			{
				p1=CreateParTable(Rbt4IC[i].PAR[1]);				//第一参数进表回返位置	
				VarIndex1=searchVar(Rbt4IC[i].PAR[2]);				//第一参数不为变量,错误
			}	
			else
			{
				toerr(i,0,2);return -1;
			}
			if (VarIndex1==-1) 
			{
				toerr(i,0,12);return -1;
			}
			else
			{
				if (ParTable.parstyle[p1]==0) 
				{
					ParTable.parvalueStr[p1].TrimLeft();
					if (ParTable.parvalueStr[p1]=="")
						dlg.m_InputHelp="输入框";
					else

						dlg.m_InputHelp=ParTable.parvalueStr[p1];
				
					dlg.DoModal();
					CString temp=dlg.m_edit;
				
					VarTable.varvalueStr[VarIndex1]=temp;
					VarTable.varvalueDouble[VarIndex1]=atof(temp); 
				}
				else
				{
					toerr(i,0,11);return -1;
				}
			}	
		}
		
		else if (Rbt4IC[i].codename=="LET")
		{
			MakeLet(i);
		}
		
		else if (Rbt4IC[i].codename=="EXP")
		{
			int VarIndex1=searchVar(Rbt4IC[i].PAR[1]);				//第一参数不为变量,错误	
			int p2=CreateParTable(Rbt4IC[i].PAR[2]);
			int index2=ParTable.parstyle[p2];						//得到参数类型
			if (VarIndex1==-1||index2!=0) 
			{
				toerr(i,0,12);return -1;
			}
			else
			{				
				
				double t=Analyse(ParTable.parvalueStr[p2]);			//表达式计算
		
				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);//保存到变量区
			}
		}



		else if (Rbt4IC[i].codename=="MID")							//字符串截取
		{	
			int t1,t2,index3, index4,p3,p4;
			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)											//表达式
			{
				t1=int(Analyse(Rbt4IC[i].PAR[3]));					//表达式计算
				index3=1;
			}
			else
			{
				p3=CreateParTable(Rbt4IC[i].PAR[3]);
				t1=int(ParTable.parvalueDouble[p3]); 
				index3=ParTable.parstyle[p3];						//得到参数类型
			}	
			BDS=TestEXP(Rbt4IC[i].PAR[4]);							//检查是否为表达式

			if (BDS==true)											//表达式
			{
				t2=int(Analyse(Rbt4IC[i].PAR[4]));					//表达式计算
				index4=1;
			}
			else
			{
				p4=CreateParTable(Rbt4IC[i].PAR[4]);
				t2=int(ParTable.parvalueDouble[p4]); 
				index4=ParTable.parstyle[p4];						//得到参数类型
			}	
			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)
				{

⌨️ 快捷键说明

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