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