scriptengine.cpp
来自「一个支持中文的类C语言编译器」· C++ 代码 · 共 1,952 行 · 第 1/5 页
CPP
1,952 行
// ScriptEngine.cpp: implementation of the CScriptEngine class.
//
//////////////////////////////////////////////////////////////////////
#pragma comment(linker,"/stack:3145728")//1024*1024*3
#include "stdafx.h"
#include "ScriptEngine.h"
#include "WordAnalyse.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define SIZE_ARRAY_PROP 1
//变量属性表
COpData array_prop[SIZE_ARRAY_PROP]={
{COpData("VarName",$STRING,0)},
// {COpData("test",$INT,1)}
// {COpData("ID",$INT,1)},
// {COpData("isModified",$BOOL,2)},
// {COpData("VarID",$INT,3)},
//{COpData("VarType",?,4)},
//{COpData("RWProp",?,5)},
//{COpData("Description",$STRING,6)}
};
/*extern*/ bool/*指示操作成功与否*/ LookUpVar(char* varname,/*变量名,输入*/
CVarDef** arrayVar,/*变量表入口,输入*/
int sizeArray,/*变量表大小,输入*/
int& i_array, /*返回的数组下标*/
// VarType,/*返回变量类型*/
COpData& opd/*返回变量值*/)
{
/*
for(int i=0;i<sizeArray;i++){
if(!strcmp(varname,arrayVar[i]->VarName->GetBuffer(0))){
break;
}
}*/
for(int i=0;i<sizeArray;i++){
char pStr[128];
int len = arrayVar[i]->VarName->GetLength();
for(int j = 0; j < len; j++)
{
pStr[j]= arrayVar[i]->VarName->GetAt(j);
}
pStr[j]='\0';
if(!strcmp(varname,pStr)){//arrayVar[i]->VarName->GetBuffer(0)
break;
}
}
if(i>=sizeArray) return false;
i_array=i;
// strcpy(opd.VarName.GetBuffer(0),arrayVar[i]->VarName->GetBuffer(0));//名
opd.VarName=*(arrayVar[i]->VarName);//名
switch(*arrayVar[i]->VarType)
{
case IOInt:
case MemInt:
opd.VarTp=$INT;//型
//必不可少。下面一条语句首先调用构造函数,接着是重载运算符函数=。
//若无此句,运算符=函数左右数据类型比较将出错。其余同理
opd=atoi(arrayVar[i]->VarRealValue);//值
break;
case IOBool:
case MemBool://
opd.VarTp=$BOOL;
opd=(bool)atoi(arrayVar[i]->VarRealValue);
break;
case IOReal:
case MemReal:
opd.VarTp=$REAL;
opd=atof(arrayVar[i]->VarRealValue);
break;
case IOStr:
case MemStr:
opd.VarTp=$STRING;
opd=arrayVar[i]->VarRealValue;
break;
default:
opd.VarTp=$INVALID;
return false;
}
return true;
}
/*extern*/ bool LookUpProperty(char* name_prop,/*变量属性名*/
COpData* arrayProp,/*属性表入口,输入*/
int &id_prop,/*返回属性id*/
VarType& varT/*返回属性数据类型*/)
{
for(int i=0;i<SIZE_ARRAY_PROP;i++)
{
if(!strcmp(name_prop,arrayProp[i].VarName.GetBuffer(0)))
{
break;
}
}
if(i>=SIZE_ARRAY_PROP) return false;
id_prop=arrayProp[i].VarVlue.intconst;//varvlue.intconst中存放着id
varT=arrayProp[i].VarTp;
return true;
}
//根据画面名查询画面文件名
CString LookUpPicFileName(CString sPicName/*画面名*/,CPicProp** pArray_pic/*画面信息数组指针*/,int sizeArray_pic)
{
int i=0;
CString szPath=ProjectPath;
for(;i<sizeArray_pic;i++)
{
if (sPicName==pArray_pic[i]->PictureName) {
szPath+=pArray_pic[i]->PictureFileName;
return szPath;
}
}
if (i>=sizeArray_pic) {
AfxMessageBox("找不到您所指定的子画面:\n \""+sPicName+"\""+"\n请检查子画面名称的书写是否正确!",MB_OK|MB_ICONHAND);
return "";
}
return "";
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
COpData CScriptEngine::static_argType[ARG_COUNT]={
{COpData($INT)},{COpData($REAL)},{COpData($BOOL)},{COpData($STRING)}
};
CFuncInfo CScriptEngine::Table_FunctionName[]={//[SIZE_TB_FUNC]={
{CFuncInfo(CTwoDim($ABS,"abs"),CArgInfo(1,static_argType))},
{CFuncInfo(CTwoDim($ACOS,"acos"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($ASIN,"asin"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($ATAN,"atan"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($COS,"cos"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($EXP,"exp"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($SIN,"sin"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($SQRT,"sqrt"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($TAN,"tan"),CArgInfo(1,&static_argType[1]))},
{CFuncInfo(CTwoDim($POW,"pow"),CArgInfo(2,&static_argType[1]))},
//系统函数
{CFuncInfo(CTwoDim($GETBITS,"GetBits"),CArgInfo(3,&static_argType[0]))},
{CFuncInfo(CTwoDim($OPENPICTURE,"OpenPicture"),CArgInfo(1,&static_argType[3]))},//参数类型为字符串
{CFuncInfo(CTwoDim($CLOSEPICTURE,"ClosePicture"),CArgInfo(1,&static_argType[3]))},//参数类型为字符串
{CFuncInfo(CTwoDim($PLAYWAVEFILE,"PlayWaveFile"),CArgInfo(2,static_argType[3],static_argType[0],static_argType[4]))},//调用可变参数个数的构造函数,最末一个参数实际上为一个结束标志
{CFuncInfo(CTwoDim($EXIT,"Exit"),CArgInfo(1,static_argType[0],static_argType[4]))},
{CFuncInfo(CTwoDim($LOGIN,"LogIn"),CArgInfo(0,static_argType[4]))},
{CFuncInfo(CTwoDim($LOGOUT,"LogOut"),CArgInfo(0,static_argType[4]))},
{CFuncInfo(CTwoDim($USERCONFIG,"UserConfig"),CArgInfo(0,static_argType[4]))}
};
int CScriptEngine::SIZE_TB_FUNC=sizeof(CScriptEngine::Table_FunctionName)/sizeof(CScriptEngine::Table_FunctionName[0]);
CScriptEngine::CScriptEngine(CVarDef **pArray_var,int sizeArray/*变量表大小*/,CEdit* ctrEdit,CString &str,int sizeArray_pic,bool isRunEnvir):m_waWrdAnly(ctrEdit,str)
{
this->array_var=pArray_var;
this->size_Array=sizeArray;
ASSERT(size_Array>0);
// size_Array=sizeof(pArray_var)/sizeof(*pArray_var);
ASSERT(array_var);
if(m_waWrdAnly.m_pctrEdit)
{
//-------------------------------------------
CRect rect;
this->m_waWrdAnly.m_pctrEdit->GetClientRect(&rect);
CDC* pDC=this->m_waWrdAnly.m_pctrEdit->GetDC();
pDC->SetBkColor(RGB(255,255,0));
pDC->TextOut(rect.Width()/2-50,0,"正在识别...");
this->m_waWrdAnly.m_pctrEdit->UpdateWindow();
this->m_waWrdAnly.m_pctrEdit->ReleaseDC(pDC);
//-------------------------------------------
}
this->m_bIsInRunEnvir=isRunEnvir;
}
CScriptEngine::CScriptEngine(PScriptEngInfo pScriptEngInfo)
:m_waWrdAnly(pScriptEngInfo->ctrEdit,*pScriptEngInfo->pStr)
{
//变量入口
this->array_var=pScriptEngInfo->pArray_var;
this->size_Array=pScriptEngInfo->sizeArray;
ASSERT(size_Array>0);
// size_Array=sizeof(pArray_var)/sizeof(*pArray_var);
ASSERT(array_var);
//子画面入口
ASSERT(pScriptEngInfo->pArray_pic);
ASSERT(pScriptEngInfo->sizeArray_pic>0);
array_pic=pScriptEngInfo->pArray_pic;
size_ArrayPic=pScriptEngInfo->sizeArray_pic;
//
if(m_waWrdAnly.m_pctrEdit)
{
//-------------------------------------------
CRect rect;
this->m_waWrdAnly.m_pctrEdit->GetClientRect(&rect);
CDC* pDC=this->m_waWrdAnly.m_pctrEdit->GetDC();
pDC->SetBkColor(RGB(255,255,0));
pDC->TextOut(rect.Width()/2-50,0,"正在识别...");
this->m_waWrdAnly.m_pctrEdit->UpdateWindow();
this->m_waWrdAnly.m_pctrEdit->ReleaseDC(pDC);
//-------------------------------------------
}
this->m_bIsInRunEnvir=pScriptEngInfo->isRunEnvir;
}
CScriptEngine::~CScriptEngine()
{
if(m_waWrdAnly.m_pctrEdit){
CRect rect;
this->m_waWrdAnly.m_pctrEdit->GetClientRect(&rect);
CDC* pDC=this->m_waWrdAnly.m_pctrEdit->GetDC();
pDC->SetBkColor(RGB(255,255,0));
pDC->TextOut(rect.Width()/2-50,0,"结束识别.");
this->m_waWrdAnly.m_pctrEdit->UpdateWindow();
this->m_waWrdAnly.m_pctrEdit->Invalidate();
this->m_waWrdAnly.m_pctrEdit->ReleaseDC(pDC);
}
}
//获取环境状态---开发?运行?
bool CScriptEngine::GetEnvirStatus()
{
return this->m_bIsInRunEnvir;
}
//设置环境状态---开发?运行?
void CScriptEngine::SetEnvirStatus(bool b)
{
this->m_bIsInRunEnvir=b;
}
bool CScriptEngine::Ident_R(CVarDef** pArray_CVarDef/*变量表入口*/,COpData &opd)//右值型
{
CTwoDim TDim;
int i_array=-1;//接收返回数组下标
VarType varT=$INT;//接收返回变量属性类型
int id_property=-1;//变量属性id
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(TDim.WdTp!=$SIGN){
MessageBox(NULL,"要求为变量名","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;//sign
}
if(!LookUpVar(TDim.WdVlue.SignOrString,pArray_CVarDef,size_Array,i_array,opd))
{
MessageBox(NULL,"变量未定义","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
TDim.InitTD();
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(TDim.WdTp!=$DOT){//.
this->m_waWrdAnly.BackWord();
return true;//说明是一般变量
}
//否则,判断是否为 变量.属性
TDim.InitTD();
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
MessageBox(NULL,"非法字符","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(this->m_waWrdAnly.m_pPtWd.piFst_word,this->m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(TDim.WdTp!=$SIGN){//sign 属性
MessageBox(NULL,"要求是变量的属性值","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
if(!LookUpProperty(TDim.WdVlue.SignOrString,array_prop,id_property,varT)){
MessageBox(NULL,"找不到变量的该属性","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
opd.VarTp=varT;//操作数类型
switch(varT)//根据返回的变量属性数据类型
{
case $INT:
opd=*((int*)pArray_CVarDef[i_array]->GetProperty(id_property));break;
case $REAL:
opd=*((double*)pArray_CVarDef[i_array]->GetProperty(id_property));break;
case $STRING://<<<<<<<<<<<<<<<应与周敬东一致<<<<<<<<<<<<<<<<<<<<<<
//opd=*((char*)pArray_CVarDef[i_array].GetProperty(id_property));break;
opd=(*((CString*)pArray_CVarDef[i_array]->GetProperty(id_property))).GetBuffer(0);break;
case $BOOL:
opd=(bool)*((BOOL*)pArray_CVarDef[i_array]->GetProperty(id_property));break;
case $INVALID:
default:
MessageBox(NULL,"不能读取该属性","错误",MB_OK|MB_ICONHAND);
if(m_waWrdAnly.m_pctrEdit){
this->m_waWrdAnly.m_pctrEdit->SetSel(m_waWrdAnly.m_pPtWd.piFst_word,m_waWrdAnly.m_pPtWd.piLst_word+1);
this->m_waWrdAnly.m_pctrEdit->SetFocus();
}
return false;
}
return true;
/*多层属性嵌套
while(TDim.WdTp==$DOT){
TDim.InitTD();
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp!=$SIGN) return false;
TDim.InitTD();
TDim=this->m_waWrdAnly.Getsym();
}
this->m_waWrdAnly.BackWord();
*/
}
//若变量类型为变量,则只有前两个参数有效,否则,需要参数0,1,3,4
bool CScriptEngine::Ident_L(CVarDef **pArray_CVarDef, //0
int& i_array,//1
COpData& opd,
VarType& varT,//3
int& id_property,//4
IdentType& identT)
{
CTwoDim TDim;
// int i_array=-1;//接收返回数组下标
varT=$INT;//接收返回变量属性类型
id_property=-1;//变量属性id
TDim=this->m_waWrdAnly.Getsym();
if(TDim.WdTp==$ILLEGALWORD){//所有getsym()函数后均应该有下述语句
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?