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 + -
显示快捷键?