scriptengine.cpp

来自「一个支持中文的类C语言编译器」· C++ 代码 · 共 1,952 行 · 第 1/5 页

CPP
1,952
字号
		return false;
	}

	if(!(argInfo==this->Table_FunctionName[i].argInfo)){
		MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
		return false;
	}

//根据查得的函数名进行处理
	switch(funTD.WdTp)//
	{
	case $ABS:	//abs
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$INT;
			opd.VarVlue.intconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $ACOS://acos
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)acos(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=abs(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $ASIN://asin
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)asin(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=asin(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $ATAN:	//atan
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)atan(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=atan(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $COS:	//cos
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)cos(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=cos(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $EXP:	//exp
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)exp(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=exp(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $SIN:	//sin
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)sin(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=sin(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
	case $SQRT:	//sqrt
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)sqrt(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=sqrt(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;		
	case $TAN:	//tan
		switch(argInfo.arg[argInfo.nCount-1].VarTp)
		{
		case $INT:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=(double)tan(argInfo.arg[argInfo.nCount-1].VarVlue.intconst);
			break;
		case $REAL:
			opd.VarTp=$REAL;
			opd.VarVlue.dbconst=tan(argInfo.arg[argInfo.nCount-1].VarVlue.dbconst);
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;	
	case $POW:	//pow(x,y)
		switch(argInfo.arg[argInfo.nCount-2].VarTp)
		{
		case $INT:
			switch(argInfo.arg[argInfo.nCount-1].VarTp)
			{
			case $INT:
				opd.VarTp=$REAL;
				opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.intconst,argInfo.arg[argInfo.nCount-2].VarVlue.intconst);
				break;
			case $REAL:
				opd.VarTp=$REAL;
				opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.intconst,argInfo.arg[argInfo.nCount-2].VarVlue.dbconst);
				break;
			default:
				opd.VarTp=$INVALID;
				MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
				return false;
			}
			break;
		case $REAL:
			switch(argInfo.arg[argInfo.nCount-1].VarTp)
			{
			case $INT:
				opd.VarTp=$REAL;
				opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.dbconst,argInfo.arg[argInfo.nCount-2].VarVlue.intconst);
				break;
			case $REAL:
				opd.VarTp=$REAL;
				opd.VarVlue.dbconst=(double)pow(argInfo.arg[argInfo.nCount-2].VarVlue.dbconst,argInfo.arg[argInfo.nCount-2].VarVlue.dbconst);
				break;
			default:
				opd.VarTp=$INVALID;
				MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
				return false;
			}
			break;
		default:
			opd.VarTp=$INVALID;
			MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
			return false;
		}
		break;
/********************GetBits(data,end,beg)************************************/
	case $GETBITS://GetBits(data,end,beg)
		//检查参数类型
		for(i=0;i<3;i++)
		{
			if(argInfo.arg[i].VarTp!=$INT)
			{
				MessageBox(NULL,"函数参数不匹配","发现错误",MB_OK|MB_ICONHAND);
				return false;
			}
		}
		opd.VarTp=$INT;
		opd.VarVlue.intconst=GetBits(argInfo.arg[0].VarVlue.intconst,argInfo.arg[1].VarVlue.intconst,argInfo.arg[2].VarVlue.intconst);
		break;		
/******************OpenPicture(string)****************************************/
	case $OPENPICTURE:
		if(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic)!=""){
			if(this->m_bIsInRunEnvir)
				AfxGetApp()->OpenDocumentFile(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic));
		}		
		break;
/******************ClosePicture(string)***********************************************/
	case $CLOSEPICTURE:
		if(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic)!=""){
			if(this->m_bIsInRunEnvir)
				CloseDocumentFile(LookUpPicFileName(argInfo.arg[0].VarVlue.SignOrString,array_pic,size_ArrayPic));
		}//全局函数CloseDocumentFile在张国辉处定义,在头文件中作了引用外部函数的声明
		break;
/******************PlayWaveFile(string,int flag)********************************************************************/
//string: 要播放的声音文件路径名
//flag-标志:0-停止播放声音;1-同步播放声音;2-异步播放声音;3-重复播放声音直到下次调用PlaySound()函数为止;4-蜂鸣器报警
	case $PLAYWAVEFILE:
		if (argInfo.arg[1].VarVlue.intconst<0||argInfo.arg[1].VarVlue.intconst>4) {		//参数不合法
			MessageBox(NULL,"该函数第2个参数取值不正确(0~4)","发现错误",MB_OK|MB_ICONHAND);
			return false;			
		}
		if (m_bIsInRunEnvir) {							//只有在运行环境,才真正执行该动作
			DWORD fdwSound=SND_NODEFAULT|SND_FILENAME;	//声音文件的播放模式
			switch(argInfo.arg[1].VarVlue.intconst) {
			case 0://停止播放声音
				fdwSound|=SND_PURGE;
				break;
			case 1://同步播放声音
				fdwSound|=SND_SYNC;
				break;
			case 2:
				fdwSound|=SND_ASYNC;
				break;
			case 3:
				fdwSound|=SND_LOOP|SND_ASYNC;
				break;
			case 4:
				fdwSound=SND_FILENAME|SND_LOOP|SND_ASYNC;
				argInfo.arg[0].VarVlue.SignOrString[0]='n';
				argInfo.arg[0].VarVlue.SignOrString[1]='u';
				argInfo.arg[0].VarVlue.SignOrString[2]='l';
				argInfo.arg[0].VarVlue.SignOrString[3]='l';
				argInfo.arg[0].VarVlue.SignOrString[4]='\0';//强制播放的声音文件名为空
				break;
			default:
				break;
			}
			if(argInfo.arg[0].VarVlue.SignOrString[0]=='\0')
				PlaySound(NULL,NULL,fdwSound);
			else
				PlaySound(argInfo.arg[0].VarVlue.SignOrString,NULL,fdwSound);
		}
		break;
	case $EXIT:
		if (m_bIsInRunEnvir) 
		{
			if( ::MessageBox( AfxGetApp()->m_pMainWnd->m_hWnd, "确实要退出吗?", "提示", MB_YESNO|MB_ICONINFORMATION|MB_DEFBUTTON2 ) == IDNO )
				return true;
			//先退出登录
			LogOut();
			//exit(argInfo.arg[0].VarVlue.intconst);
			BOOL bForSwi = ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_bForSwi;
			BOOL bForCAD = ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_bForCAD;
//			if(bForSwi)
				CTaskKeyMgr::Disable(CTaskKeyMgr::TASKKEYS, FALSE);
//			if(bForCAD)
				CTaskKeyMgr::Disable(CTaskKeyMgr::TASKMGR,FALSE);

			PostMessage(NULL,WM_QUIT,0,0);
		}
		break;
	case $LOGIN:
		if (m_bIsInRunEnvir) {
			Login();
		}
		break;
	case $LOGOUT:
		if (m_bIsInRunEnvir) {
			LogOut();
		}
		break;
	case $USERCONFIG:
		if (m_bIsInRunEnvir) {
			UserConfig();
		}
		break;
	default:
		opd.VarTp=$INVALID;
		MessageBox(NULL,"目前尚不支持该函数!","错误",MB_OK|MB_ICONHAND);
		return false;
	}
/**/
	return true;
}

bool CScriptEngine::Item(COpData &opd)
{
	COpData opdata;
	CTwoDim TDim;

	if(!this->Factor(opd)) return false;

	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;
	}

	while(TDim.WdTp==$STAR||TDim.WdTp==$DIVIDE){
		if(!this->Factor(opdata)) return false;
		
		switch(TDim.WdTp)
		{
		case $STAR:
			opd=opd*opdata;
			break;
		case $DIVIDE:
			opd=opd/opdata;
			break;
		default:
			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;
		}
	}

	this->m_waWrdAnly.BackWord();
	if(opd.VarTp==$INVALID){
		return false;
	}
	return true;

}

bool CScriptEngine::Condition(bool &blResult)
{
	BOOL temp_result;//暂存三态结果
	PTSTR	ptStr=this->m_waWrdAnly.m_ptStr;//记录初始位置,便于退回
	int		piPointer=this->m_waWrdAnly.m_piPointer;//记录初始位置,便于退回
	CTwoDim TDim;
	COpData exp1,exp2;

	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==$LPAR){//(
		if(!DBCondition(blResult)){//识别不成功,再试探  表达式?表达式  型
			this->m_waWrdAnly.m_ptStr=ptStr;
			this->m_waWrdAnly.m_piPointer=piPointer;
			goto L_EXP;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?