executecode.cpp

来自「我的简易编译器终于在花了近20个工作日后完成了。按照设计是做成一个Formula」· C++ 代码 · 共 823 行 · 第 1/2 页

CPP
823
字号
			if(nDataCount>0)
				fDataSum /= nDataCount;
			pvRes->SetFloat(fDataSum);
		}
		break;
	case FUNC_BYTE		://2
		{
			ASSERT(nPrmSum>=2);
			pPrm = m_RuntimeStack[0];
			pPrm2 = m_RuntimeStack[1];
			int nbit = pPrm2->ToInt();
			CString strBit;
			CString tempStr;
			if(	pPrm->GetType() == VDT_NUMBER || pPrm->GetType() == VDT_ARRAY_NUMBER){
				tempStr.Format("%f",pPrm->ToFloat());
				strBit = CRegularOpt::GetNumbtye(tempStr,nbit);
			}else{
				tempStr = pPrm->ToString();
				int sl = tempStr.GetLength();
				if( nbit >=0 && nbit < sl) 
					strBit = tempStr[nbit];
				else 
					strBit = "";
			}
			pvRes->SetValue(strBit);
		}
		break;
	case FUNC_CAPITAL	://1,2
		{
			ASSERT(nPrmSum>=1);
			pPrm = m_RuntimeStack[0];
			bool isSimple=false;
			if(nPrmSum>1 && m_RuntimeStack[1]->ToBool())
				isSimple = true;
			CString tempStr;
			tempStr.Format("%f",pPrm->ToFloat());
			pvRes->SetString( CRegularOpt::Capitalization(tempStr,isSimple));
		}
		break;
	case FUNC_MAX		://-1
		{
			float fDataSum=0.f;
			if(nPrmSum>0)
				fDataSum = m_RuntimeStack[0]->MaxFloat();
			for(i=1;i<nPrmSum;i++){
				if( fDataSum < m_RuntimeStack[i]->MaxFloat())
					fDataSum = m_RuntimeStack[0]->MaxFloat();
			}

			pvRes->SetFloat(fDataSum);
		}
		break;
	case FUNC_MIN		://-1
		{
			float fDataSum=0.f;
			if(nPrmSum>0)
				fDataSum = m_RuntimeStack[0]->MinFloat();
			for(i=1;i<nPrmSum;i++){
				if( fDataSum < m_RuntimeStack[i]->MinFloat())
					fDataSum = m_RuntimeStack[0]->MinFloat();
			}
			pvRes->SetFloat(fDataSum);
		}
		break;
	case FUNC_SUM		://-1
		{
			int nDataCount=0;
			float fDataSum=0.f;
			for(i=0;i<nPrmSum;i++){
				fDataSum += m_RuntimeStack[i]->SumFloat();
				nDataCount += m_RuntimeStack[i]->GetCount();
			}
			pvRes->SetFloat(fDataSum);
		}
		break;
	case FUNC_STRCAT	://-1
		{
			CString tempStr;
			for(i=0;i<nPrmSum;i++)
				tempStr += m_RuntimeStack[i]->ToString();
			pvRes->SetString(tempStr);
		}
		break;
	case FUNC_ROUND		://1,2
		{
			ASSERT(nPrmSum>=1);
			pPrm = m_RuntimeStack[0];
			int nPrecision = 0;
			if(nPrmSum>1)
				nPrecision = m_RuntimeStack[1]->ToInt();

			CString tempStr;
			tempStr.Format("%f",pPrm->ToFloat());
			pvRes->SetValue(CRegularOpt::PrecisionNum(tempStr,nPrecision));
		}
		break;
	case FUNC_SUBSTR    ://1,2,3
		{
			ASSERT(nPrmSum>=1);
			CString tempStr = m_RuntimeStack[0]->ToString();
			int nStart(0),nLength;
			if(nPrmSum>=2)
				nStart = m_RuntimeStack[1]->ToInt();

			if(nPrmSum>=3){
				nLength = m_RuntimeStack[1]->ToInt();
 				if(nLength<=0) nLength = 1;
				tempStr = tempStr.Mid(nStart,nLength);
			}else
				tempStr = tempStr.Mid(nStart);

			pvRes->SetValue(tempStr);
		}
		break;
	case FUNC_MATCH		://2
		{
			ASSERT(nPrmSum>=2);
			pPrm = m_RuntimeStack[0];
			pPrm2 = m_RuntimeStack[1];
			if(CRegularOpt::IsMatch(pPrm->ToString() ,pPrm2->ToString()))
				pvRes->SetFloat(1);
			else 
				pvRes->SetFloat(0);
		}
		break;
	case FUNC_COUNT		://-1
		{
			int nDataCount=0;
			for(i=0;i<nPrmSum;i++)
				nDataCount += m_RuntimeStack[i]->GetCount();
			pvRes->SetFloat(nDataCount);
		}
		break;
	case FUNC_LN        ://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =(af>0)?log(af):0;
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_EXP		://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =exp(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_SQRT      ://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =(af>=0)?sqrt(af):sqrt(-af);;
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_LOG       ://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =(af>0)?log10(af):0;
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_SIN       ://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =sin(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_COS		://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =cos(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_TAN       ://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =tan(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_CTAN		://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =tanh(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_FIND		://2
		{
			ASSERT(nPrmSum>=2);
			int nStart(0);
			if(nPrmSum>=3){
				nStart = m_RuntimeStack[2]->ToInt();
				if(nStart<0) 
					nStart = 0;
			}

			CString tempStr = m_RuntimeStack[1]->ToString();
			int nS = tempStr.Find(m_RuntimeStack[0]->ToString(),nStart); 
			pvRes->SetFloat(nS);
		}
		break;
	case FUNC_FREQUENCE ://2
		{
			ASSERT(nPrmSum>=2);
			int nStart(0);
			if(nPrmSum>=3){
				nStart = m_RuntimeStack[2]->ToInt();
				if(nStart<0) 
					nStart = 0;
			}

			CString subStr = m_RuntimeStack[0]->ToString();
			CString tempStr = m_RuntimeStack[1]->ToString();
			int nSt(0),sl=subStr.GetLength(),nC(0);
			nSt = tempStr.Find(subStr,nSt);
			while(nSt>0){
				nC ++;
				nSt +=sl;
				nSt = tempStr.Find(subStr,nSt);
			}
			pvRes->SetFloat(nC);
		}
		break;
	case FUNC_INT		://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =int(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_FRAC		://1
		{
			ASSERT(nPrmSum>=1);
			float af = m_RuntimeStack[0]->ToFloat();
			af =af - int(af);
			pvRes->SetFloat(af);
		}
		break;
	case FUNC_DAY		://0,1
	case FUNC_MONTH		://0,1
	case FUNC_YEAR		://0,1
	case FUNC_DAY_SPAN	://1,2
	case FUNC_MONTH_SPAN://1,2
	case FUNC_YEAR_SPAN	://1,2
		break;
	case FUNC_TODAY		://0,1
		{
			CString tmpStr = CTime::GetCurrentTime().Format("%Y-%m-%d");
			pvRes->SetString(tmpStr);
		}
		break;
	case FUNC_GET_TIME		://0,1
		{
			CString tmpStr = CTime::GetCurrentTime().Format("%H:%M:%S");
			pvRes->SetString(tmpStr);
		}
		break;
	case FUNC_GET_TICK		://0,1
		pvRes->SetFloat(float( GetTickCount()));
		break;
	case FUNC_STDDEV	://-1
		{
			int nDataCount=0;
			double fDataSum=0.f;
			for(i=0;i<nPrmSum;i++){
				fDataSum += m_RuntimeStack[i]->SumFloat();
				nDataCount += m_RuntimeStack[i]->GetCount();
			}
			if(nDataCount<2){
				pvRes->SetFloat(0);
			}else{
				double dbAvg =	fDataSum / nDataCount;
				double dbtemp = .0;
				for(i=0;i<nPrmSum;i++){
					int nDC = m_RuntimeStack[i]->GetCount();
					for(int j=0;j<nDC;j++){
						double dtp = m_RuntimeStack[i]->GetFloat(j) - dbAvg;
						dbtemp += dtp*dtp; 
					}
				}
				dbtemp = sqrt(dbtemp/double(nDataCount-1));
				pvRes->SetFloat(dbtemp);
			}
		}
		break;
	case FUNC_GET_STR://1
		{
			ASSERT(nPrmSum>=1);
			CString resStr;
			CString tempStr = m_RuntimeStack[0]->ToString();
			for(i=0; i < CConstDef::SYSSTRSUM; i++)
				if(tempStr.Compare(CConstDef::SYSSTRINGS[i].sName)==0){
					resStr = CConstDef::SYSSTRINGS[i].sValue;
					break;
				}
			pvRes->SetString(resStr);
		}
		break;
	case FUNC_GET_PY	://1
		{
			ASSERT(nPrmSum>=1);
			CString tempStr = m_RuntimeStack[0]->ToString();
			pvRes->SetString( CCharCode::GetPYABIndex(tempStr) );
		}
		break;
	case FUNC_MAKE_ARRAY	://-1
		{
			int nDataCount=0;
			for(i=0;i<nPrmSum;i++){
				nDataCount += m_RuntimeStack[i]->GetCount();
			}
			float *	fArVal = new float[nDataCount+1];
			int nInd=0;
			for(i=0;i<nPrmSum;i++){
				int nDC = m_RuntimeStack[i]->GetCount();
				for(int j=0;j<nDC;j++){
					fArVal[nInd] = m_RuntimeStack[i]->GetFloat(j);
					nInd++;
				}
			}
			pvRes->SetArrayNumber(nDataCount,fArVal,true);
			delete [] fArVal;
		}
		break;
	}
}

void CExecuteCode::SetFormulaModule(PFORMUALMODULE pFM)
{
	m_pFormulaModula = pFM;
}

void CExecuteCode::Run(BOOL bIsInPlace)
{
	ASSERT(m_pFormulaModula);
	m_bHasRet = FALSE;
	m_RunModule = bIsInPlace;
	//复制变量表副本
	m_slOutput.RemoveAll();
	m_RuntimeStack.Clear();
	if(! bIsInPlace){
		m_CurVarTable.RemoveAll();
		m_UsedParentVarTable.RemoveAll();
		m_pFormulaModula->ReplicateVarTable(m_CurVarTable);

		POSITION pPos = m_pFormulaModula->varTable.GetHeadPosition();
		while(pPos)
			m_CurVarTable.AddTail(m_pFormulaModula->varTable.GetNext(pPos));
	}

	m_CurFormulaPos=0;
	int nFormulaSum = m_pFormulaModula->GetFormulaItemSum();
	if(bIsInPlace){
		while(m_CurFormulaPos < nFormulaSum){
		//	m_CurFormulaPos++;
			if( RunCurFormula2())
				break;
		}
//		m_RetVar.vType = VDT_NUMBER;
	}else{
		while(m_CurFormulaPos < nFormulaSum){
		//	m_CurFormulaPos++;
			if( RunCurFormula())
				break;
		}
	}
}

PVARITEM CExecuteCode::GetRetValue()
{
	if(m_bHasRet)
		return &m_RetVar;
	return NULL;
}
CString  CExecuteCode::GetRetDesc()
{
	if(m_bHasRet)
		return m_RetVar.ToString();
	return CString("NULL");
}
float  CExecuteCode::GetResult()
{
	if(m_bHasRet)
		return m_RetVar.GetFloat();
	return 0;
}

int	 CExecuteCode::GetOutputSum()
{
	return m_slOutput.GetCount();
}

CString CExecuteCode::GetOutputDesc(int nInd)
{
	POSITION p = m_slOutput.FindIndex(nInd);
	if(p==NULL)
		return CString("");
	return m_slOutput.GetAt(p);
}

⌨️ 快捷键说明

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