📄 kld01dlg.cpp
字号:
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 + -