📄 kld01dlg.cpp
字号:
//取出第一个宏作为执行宏
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 + -