scriptengine.cpp

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

CPP
1,952
字号
		}

		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;
	}
	else{//不是以(开始的条件表达式
		this->m_waWrdAnly.BackWord();
	}

	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==$NOT){//!
		if(!this->Condition(blResult))return false;
		blResult=!blResult;
		return true;
	}
	this->m_waWrdAnly.BackWord();

L_EXP:
	if(!this->Expression(exp1))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!=$DEQ&&TDim.WdTp!=$NEQ&&
		TDim.WdTp!=$LOW&&TDim.WdTp!=$LOEQ&&
		TDim.WdTp!=$LARGE&&TDim.WdTp!=$LAEQ){
		this->m_waWrdAnly.BackWord();//仅有左表达式,多读了一个单词
		temp_result=(exp1!=0);
		if(temp_result==-1)return false;
		blResult=temp_result;
		return true;
	}

	if(!this->Expression(exp2))return false;
	switch(TDim.WdTp)
	{
	case $DEQ://==
		temp_result=(exp1==exp2);
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	case $NEQ://!=
		temp_result=(exp1!=exp2);	
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	case $LOW://<
		temp_result=(exp1<exp2);
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	case $LOEQ://<=
		temp_result=(exp1<=exp2);
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	case $LARGE://>
		temp_result=(exp1>exp2);
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	case $LAEQ://>=
		temp_result=(exp1>=exp2);
		if(temp_result==-1)return false;
		blResult=temp_result;
		break;
	default:
		return false;
	}

	return true;
}

bool CScriptEngine::DBCondition(bool &blResult)
{
	CTwoDim TDim;
	bool bRl=false,bRr=false;//用于 条件&&条件 中两个条件的返回值

	if(!this->Condition(bRl))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!=$DAND&&TDim.WdTp!=$DOR){//单条件表达式
		this->m_waWrdAnly.BackWord();
		blResult=bRl;
		return true;
	}

	//复合条件表达式
	if(!this->Condition(bRr))return false;
	switch(TDim.WdTp)
	{
		case $DAND:
			blResult=bRl&&bRr;
			break;
		case $DOR:
			blResult=bRl||bRr;
			break;
		default:
			return false;
	}

	return true;

}

ReturnType CScriptEngine::Sentence()
{
//	CVarDef* parray_cvardef=NULL;//????????????????????????
	int i_array,id_property;
	VarType varT;
	IdentType idenT;


	ReturnType rT;//返回类型
	bool conInfo;//记录条件表达式运算结果
	COpData expInfo,opd;//记录表达式信息
	CTwoDim TDim;
	PTSTR	ptStr,ptstr_end,pts_while,pts_end;//记录中间位置
	int		piPointer,piPnt_end,pip_while,pip_end;//记录中间位置

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

	switch(TDim.WdTp)
	{
	case $LBP://{

		//提供对空语句的支持
		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==$RBP) return SUCCESSFUL;
		else this->m_waWrdAnly.BackWord();

		rT=Sentence();
		if(rT!=SUCCESSFUL){
			if(rT==NOTTHISKIND){
					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(rT==SUCCESSFUL){
			rT=Sentence();

			//已到达文件尾
			if(*this->m_waWrdAnly.m_ptStr=='\000') break;
		}

		if(rT==ERRINPROCESS)return ERRINPROCESS;

        if(rT!=NOTTHISKIND){
			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;
		}

		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!=$RBP){
			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;//要求以'}'做结
		}

		return SUCCESSFUL;
		break;
	case $IF://if
		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();
			}
			return ERRINPROCESS;////要求为左括号(
		}

		if(!DBCondition(conInfo)) 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;////要求为右括号)
		}

		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!=$LBP){
			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;//要求为{
		}

		ptStr=this->m_waWrdAnly.m_pPtWd.pFst_word;//记录中间位置
		piPointer=this->m_waWrdAnly.m_pPtWd.piFst_word;//if(---){ 中的{位置

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^	
		if(this->m_bIsInRunEnvir){//运行环境

			if(conInfo){//条件表达式为真时,执行if(---){}中语句+++++++++++++++++++++++++++++

				//提供对空语句的支持
				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==$RBP) goto ELSE_RUN;
				else 
					this->m_waWrdAnly.BackWord();

				//多条语句
				rT=Sentence();
				if(rT!=SUCCESSFUL){
					if(rT==NOTTHISKIND){
					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(rT==SUCCESSFUL){
					rT=Sentence();

					//已到达文件尾
					if(*this->m_waWrdAnly.m_ptStr=='\000') break;
				}

				if(rT==ERRINPROCESS)return ERRINPROCESS;

				if(rT!=NOTTHISKIND){
					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;
				}

				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!=$RBP){
					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;//要求以'}'做结
				}

				//同时,越过else子句++++++++++++++++++++++++++++++++++
ELSE_RUN:
				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!=$ELSE){//如果没有else子句
					this->m_waWrdAnly.BackWord();
					return SUCCESSFUL;//ERRINPROCESS;

⌨️ 快捷键说明

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