scriptengine.cpp

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

CPP
1,952
字号
		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))//若操作成功,返回下标(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();
		identT=$VARIANT;
		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*/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;
	}
	identT=$PROPERPTY;//属性
	return true;
}

ReturnType CScriptEngine::Function(COpData &opd)
{
//	COpData opd;
	PTSTR	ptStr=this->m_waWrdAnly.m_ptStr;//记录初始位置,便于退回
	int		piPointer=this->m_waWrdAnly.m_piPointer;//记录初始位置,便于退回

	int		first_fun=0;//指示函数名位置
	int		end_fun=0;
////TRACE("_____________________:%s",this->m_waWrdAnly.m_ptStr);
	CTwoDim TDim;
	CTwoDim funTD;//暂存信息
	CArgInfo argInfo;//参数信息

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

	if(TDim.WdTp!=$SIGN){//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();}*/
		this->m_waWrdAnly.BackWord();
		return NOTTHISKIND;
	}//要求为函数名或变量名

	first_fun=this->m_waWrdAnly.m_pPtWd.piFst_word;
	end_fun=this->m_waWrdAnly.m_pPtWd.piLst_word;

	strcpy(funTD.WdVlue.SignOrString,TDim.WdVlue.SignOrString);//存函数名
	 
	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 ERRINPROCESS;
	}

	if(TDim.WdTp!=$LPAR){//(
	/*	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();}*/
		
		this->m_waWrdAnly.m_ptStr=ptStr;//恢复指针位置
		this->m_waWrdAnly.m_piPointer=piPointer;//恢复指针位置
		return NOTTHISKIND;
	}//要求为(

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

	if(TDim.WdTp==$RPAR){//)  不带参数
		if(this->LookUpFunList(funTD,argInfo,opd)){//opd返回函数输出信息
			return SUCCESSFUL;
		}
		else{
			return ERRINPROCESS;
		}
	}
	else{
		this->m_waWrdAnly.BackWord();
	}

	//带参数
	if(!this->Expression(argInfo.arg[0]))return ERRINPROCESS;
	argInfo.nCount++;

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

	while(TDim.WdTp==$COMMA&&argInfo.nCount<ARG_COUNT){
		if(!this->Expression(argInfo.arg[++argInfo.nCount-1]))return ERRINPROCESS;		
		
		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 ERRINPROCESS;
		}
	}

	if(TDim.WdTp!=$RPAR){//)
		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 ERRINPROCESS;//要求为)
	}

	if(!this->LookUpFunList(funTD,argInfo,opd)){
		MessageBox(NULL,"没有这种函数","错误",MB_OK|MB_ICONHAND);
		if(m_waWrdAnly.m_pctrEdit){
			this->m_waWrdAnly.m_pctrEdit->SetSel(first_fun,end_fun+1);
			this->m_waWrdAnly.m_pctrEdit->SetFocus();
		}
		return ERRINPROCESS;//没有这种函数
	}

	if(opd.VarTp==$INVALID) return ERRINPROCESS;
	return SUCCESSFUL;
}
bool CScriptEngine::Factor(COpData &opd)
{ ////TRACE("_____________________:%s",this->m_waWrdAnly.m_ptStr);
	ReturnType returnT;//判断是否函数
	CTwoDim TDim;
	
	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==$FCONST){//实型常量
		opd.VarTp=$REAL;
		opd.VarVlue.dbconst=TDim.WdVlue.dbconst;
		return true;
	}

	if(TDim.WdTp==$ICONST){//整型常量
		opd.VarTp=$INT;
		opd.VarVlue.intconst=TDim.WdVlue.intconst;
		return true;
	}

	if(TDim.WdTp==$SCONST){//字符串常量
		opd.VarTp=$STRING;
		strcpy(opd.VarVlue.SignOrString,TDim.WdVlue.SignOrString);
		return true;
	}

	if(TDim.WdTp==$LPAR){//(表达式)
		if(!this->Expression(opd)) 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!=$RPAR){
			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;
		}
		return true;
	}

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

	this->m_waWrdAnly.BackWord();

	//函数或ident_R
	returnT=this->Function(opd);
	switch(returnT)
	{
	case SUCCESSFUL:
		if(opd.VarTp==$INVALID) return false;
		return true;
	case NOTTHISKIND:
		ASSERT(array_var);//确保变量表入口指针有效
		if(!this->Ident_R(array_var,opd)) return false;
		return true;
	case ERRINPROCESS:
	default:
		return false;
	}

}

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

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

	switch(TDim.WdTp)
	{
	case $PLUS:
		if(!this->Item(opd)) return false;
		break;
	case $MINUS:
		if(!this->Item(opd)) return false;
		opd=0-opd;
		break;
	case $ILLEGALWORD:
	/*	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;*/
	default:
		this->m_waWrdAnly.BackWord();
		if(!this->Item(opd)) return false;
		break;
	}
	
	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;
	}

	while(TDim.WdTp==$PLUS||TDim.WdTp==$MINUS){
		if(!this->Item(opdata)) return false;
		switch(TDim.WdTp)
		{
		case $PLUS:
			opd=opd+opdata;
			break;
		case $MINUS:
			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::LookUpFunList(CTwoDim funTD, CArgInfo &argInfo, COpData &opd)
{
	//funTD贮存函数名
	//argInfo贮存参数信息,包括参数个数及贮存在操作数数组中的各个参数(型,值)
	//opd用以返回查询函数后返回的结果

	for(int i=0;i<SIZE_TB_FUNC;i++){//注意,添加或删除函数时,注意更新SIZE_TB_FUNC
		if(!strcmp(funTD.WdVlue.SignOrString,this->Table_FunctionName[i].TDim.WdVlue.SignOrString)){
			funTD.WdTp=this->Table_FunctionName[i].TDim.WdTp;//根据函数名字符串信息填充函数的枚举类型信息,以方便处理(后续判断无需再用'switch()case;'比较函数名,只要比较枚举类型即可)
			break;
		}
	}
	if(i>=SIZE_TB_FUNC){//不存在该函数
	//	MessageBox(NULL,"函数名错误","发现错误",MB_OK|MB_ICONHAND);

⌨️ 快捷键说明

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