⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formulamodula.cpp

📁 我的简易编译器终于在花了近20个工作日后完成了。按照设计是做成一个FormulaEx.dll
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// FormulaModula.cpp: implementation of the CFormulaImpl class.
//
//////////////////////////////////////////////////////////////////////
/*
 * Generated by MyEclipse Struts
 * 
 * Written by Yang Huaisheng 
 * Homepage: http://codefan.spaces.live.com
 * version 0.01
 * create at 2006-04-30
 * 
 *  Distribute freely, except: don't remove my name from the source or
 *  documentation (don't take credit for my work), mark your changes (don't
 *  get me blamed for your possible bugs), don't alter or remove this
 *  notice.
 *  No warrantee of any kind, express or implied, is included with this
 *  software; use at your own risk, responsibility for damages (if any) to
 *  anyone resulting from the use of this software rests entirely with the
 *  user.
 * 
 *  Send bug reports, bug fixes, enhancements, requests, flames, etc. to
 *     codefan@hotmial.com
 *  
 */

#include "stdafx.h"
#include "..\HEADER\FormulaImpl.h"
#include "..\..\Formule\Calc\RegularOpt.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CVarItem::CVarItem():
nAllocType(0){
	nLen = 0;
	fArVal = NULL;
	nStyle = VIS_UNKNOW;
	isUsed = FALSE;
	vType = VDT_NUMBER;
}

CVarItem::~CVarItem()
{
//	if(nAllocType==1 && sVal != NULL)
//		delete [] sVal;	else 
	if(nAllocType==2 && fArVal != NULL){
		delete [] fArVal;
		fArVal = NULL;
	}
	nAllocType=0;
}


CVarItem & CVarItem::Clone (CVarItem & tmpItem)
{
//	vType = tmpItem.vType;//
//	fVal = tmpItem.fVal;
//	return *this;
	if(nAllocType==2 && fArVal != NULL)
		delete [] fArVal;
	fArVal = NULL;
	//isUsed = tmpItem.isUsed;
	//nISN = tmpItem.nISN;
	//nStyle = tmpItem.nStyle;// 0:unknow 1:varialbe 2:const variable 3:temp variable 
	nAllocType = tmpItem.nAllocType;// 0:nualloc  1:alloc char[] 2:alloc float[]
	vType = tmpItem.vType;//
	switch(vType){
	case VDT_NUMBER :
		fVal = tmpItem.fVal;
		break;
	case VDT_ARRAY_NUMBER :
		{
			nLen = tmpItem.nLen;
			if(nAllocType==2 && tmpItem.fArVal != NULL){
				fArVal = new float[nLen];
				CopyMemory(fArVal,tmpItem.fArVal,sizeof(float)*nLen);
			}else{
				nAllocType=0; 
				fArVal = tmpItem.fArVal;
			}
		}
		break;
	//case VDT_STRING :
	default:
		szValue = tmpItem.szValue;
		break;
 	}
	return *this;
}

CVarItem & CVarItem::operator=(CVarItem & tmpItem)
{
	if(nAllocType==2 && fArVal != NULL)
		delete [] fArVal;
	fArVal = NULL;
	isUsed = tmpItem.isUsed;
	nISN = tmpItem.nISN;
	nStyle = tmpItem.nStyle;// 0:unknow 1:varialbe 2:const variable 3:temp variable 
	nAllocType = tmpItem.nAllocType;// 0:nualloc  1:alloc char[] 2:alloc float[]
	vType = tmpItem.vType;//
    strcpy(szName,tmpItem.szName);    //char[32]
//	szValue = tmpItem.szValue;
	switch(vType){
	case VDT_NUMBER :
		fVal = tmpItem.fVal;
		break;
	case VDT_ARRAY_NUMBER :
		{
			nLen = tmpItem.nLen;
			if(nAllocType==2 && tmpItem.fArVal != NULL){
				fArVal = new float[nLen];
				CopyMemory(fArVal,tmpItem.fArVal,sizeof(float)*nLen);
			}else{
				nAllocType=0; 
				fArVal = tmpItem.fArVal;
			}
		}
		break;
	//case VDT_STRING :
	default:
		szValue = tmpItem.szValue;
		break;
 	}

	return *this;
}

void CVarItem::SetName(LPCTSTR sn)
{
	int nsl = (strlen(sn) > SIGNLENGTH) ? SIGNLENGTH : strlen(sn);
	CopyMemory(szName,sn,nsl);
	szName[nsl] = 0;
}

void CVarItem::SetType(VAR_DATA_TYPE vt)
{
	if(vType==vt) return;
	vType = vt;
	if(nAllocType==2 && fArVal != NULL){
		delete [] fArVal;
		fArVal = NULL;
		nAllocType = 0;
	}
	nLen = 0;
}

void CVarItem::SetValue(LPCTSTR sv)
{
	szValue = sv;
	if(CRegularOpt::IsNumber(sv)){
		SetType(VDT_NUMBER);
		fVal = float(atof(sv));
	}else if(CRegularOpt::IsNumberArray(sv)){
		SetType(VDT_ARRAY_NUMBER);
		if(nAllocType==2 && fArVal != NULL)
			delete [] fArVal;
		fArVal = NULL;
		CArray<float,float>  arfData;
		CRegularOpt::SplitFloatList(sv,arfData,',');
		nLen = arfData.GetSize();
		if(nLen>0){
			nAllocType=2; 
			fArVal = new float[nLen];
			for(int i=0;i<nLen;i++)
				fArVal[i] = arfData[i];
		}
	}else{
		SetType(VDT_STRING);
	}
}

void CVarItem::SetString(LPCTSTR sv)
{
	SetType(VDT_STRING);
	szValue = sv;
}

void CVarItem::SetFloat(float fv)
{
	//szValue.Format("%f",fv);
	SetType(VDT_NUMBER);
	fVal = fv;
}

void CVarItem::SetArrayNumber(int nl,float * lpv,bool bCopy)
{
	vType = VDT_ARRAY_NUMBER;

	if(nAllocType==2 && fArVal != NULL){
		delete [] fArVal;
		fArVal = NULL;
		nAllocType = 0;
	}
	nLen = nl;
	if(bCopy && nl>0){
		nAllocType=2; 
		fArVal = new float[nl];
		CopyMemory(	fArVal,lpv,nl*sizeof(float));
	}else
		fArVal = lpv;
}

inline void CVarItem::SetUsed()
{
	isUsed = TRUE;
}

CString CVarItem::GetName()
{
	switch(nStyle){
	case VIS_VARIABLE:
		return CString(szName);
	case VIS_CONST:
		return GetValue();
	case VIS_TEMP:{
		CString sTmpName;
		sTmpName.Format("TMP#%d", nISN-TEMPISN_START+1);
		return sTmpName;
				  }
	}	
	return CString("   ");
}

VAR_DATA_TYPE CVarItem::GetType()
{
	return vType;
}

CString CVarItem::GetValue()
{
	switch(vType){
	case VDT_STRING:
		return szValue; 
	case VDT_NUMBER :
		szValue.Format("%f",fVal);
		szValue = CRegularOpt::PrecisionNum(szValue);
		return szValue;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return CString("");
			CString sTmp ;
			sTmp.Format("%f",fArVal[0]);
			szValue = CRegularOpt::PrecisionNum(sTmp);
			for(int i=1;i<nLen;i++){
				sTmp.Format("%f",fArVal[i]);
				szValue +="," + CRegularOpt::PrecisionNum(sTmp);
			}
		}
 	}
	return szValue;
}

float	CVarItem::GetFloat(float fPos)
{
	switch(vType){
	case VDT_NUMBER :
		return fVal;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return 0.f;
			if(nLen==1) return fArVal[0];
			if(fPos<0)
				return fArVal[0] + fPos*(fArVal[1]-fArVal[0]);
			if(fPos < nLen-1)
				return fArVal[int(fPos)]
				     + (fArVal[int(fPos)+1] - fArVal[int(fPos)]) * (fPos-int(fPos));

			return fArVal[nLen-1] + (fArVal[nLen-1]-fArVal[nLen-2]) * (fPos-nLen+1);
		}
		break;
 	};
	return 0.f;
}
BOOL CVarItem::ToBool()
{
	if(szValue.CompareNoCase("true")==0) 
		return TRUE;
	return (GetFloat(0) < -0.01) || (GetFloat(0) > 0.01);
}
float CVarItem::ToFloat()
{
	return GetFloat(0);
}
int  CVarItem::ToInt()
{
	return int(GetFloat()+0.5);
}
float CVarItem::MinFloat()
{
	switch(vType){
	case VDT_NUMBER :
		return fVal;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return 0.f;
			float minFV = fArVal[0];
			for(int i=1;i<nLen;i++)
				if(minFV > fArVal[i])
					minFV = fArVal[i];
			return minFV;
		}
 	};
	return 0.f;
}
float CVarItem::MaxFloat()
{
	switch(vType){
	case VDT_NUMBER :
		return fVal;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return 0.f;
			float maxFV = fArVal[0];
			for(int i=1;i<nLen;i++)
				if(maxFV < fArVal[i])
					maxFV = fArVal[i];
			return maxFV;
		}
 	};
	return 0.f;
}
float CVarItem::SumFloat()
{
	switch(vType){
	case VDT_NUMBER :
		return fVal;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return 0.f;
			float sumFV = fArVal[0];
			for(int i=1;i<nLen;i++)
				sumFV += fArVal[i];
			return sumFV;
		}
 	};
	return 0.f;
}

float CVarItem::AveFloat()
{
	switch(vType){
	case VDT_NUMBER :
		return fVal;
	case VDT_ARRAY_NUMBER :
		{
			if(nLen==0) return 0.f;
			float sumFV = fArVal[0];
			for(int i=1;i<nLen;i++)
				sumFV += fArVal[i];
			return sumFV / nLen;
		}
 	};
	return 0.f;
}
int   CVarItem::GetCount()
{
	if(vType == VDT_ARRAY_NUMBER)
		return nLen;
	return 1;
}

CString CVarItem::ToString()
{
	return GetValue();
}

CString CVarItem::GetDescribe(LIST_VAR_TYPE nListType)
{
	CString sDesc;
	switch(nStyle){
	case VIS_VARIABLE:
		sDesc = "VAR ";
		sDesc += szName;
		break;
	case VIS_CONST:
		sDesc = "CONST ";
		break;
	case VIS_TEMP:
		sDesc.Format("TMP#%d ", nISN-TEMPISN_START+1);
		break;
	}	
	return sDesc + ":" + GetValue();
}

CVarItem AFXAPI operator+( CVarItem & tmpItem, CVarItem & tmpItem2)
{
//	CString 
	CVarItem retVar;
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		retVar.SetFloat(tmpItem.ToFloat() + tmpItem2.ToFloat());
	else
		retVar.SetString( tmpItem.ToString() + tmpItem2.ToString());
	return retVar;
}
CVarItem AFXAPI operator-(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	CVarItem retVar;
	retVar.SetFloat(tmpItem.ToFloat() - tmpItem2.ToFloat());
	return retVar;
} 
CVarItem AFXAPI operator*(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	CVarItem retVar;
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		retVar.SetFloat(tmpItem.ToFloat() * tmpItem2.ToFloat());
	else
		retVar.SetString( tmpItem.ToString() + tmpItem2.ToString());
	return retVar;
} 
CVarItem AFXAPI operator/(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	CVarItem retVar;
	if(tmpItem2.ToFloat()==0.f)
		retVar.SetFloat(0);
	else
		retVar.SetFloat(tmpItem.ToFloat() / tmpItem2.ToFloat());
	return retVar;
} 
BOOL AFXAPI operator==(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() == tmpItem2.ToFloat();
	
	return tmpItem.ToString() == tmpItem2.ToString();
} 
BOOL AFXAPI operator!=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() != tmpItem2.ToFloat();
	
	return tmpItem.ToString() != tmpItem2.ToString();
} 
BOOL AFXAPI operator>(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() > tmpItem2.ToFloat();
	
	return tmpItem.ToString() > tmpItem2.ToString();
} 
BOOL AFXAPI operator<(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() < tmpItem2.ToFloat();
	
	return tmpItem.ToString() < tmpItem2.ToString();
} 
BOOL AFXAPI operator>=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() >= tmpItem2.ToFloat();
	
	return tmpItem.ToString() >= tmpItem2.ToString();
} 
BOOL AFXAPI operator<=(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	if( (tmpItem.GetType()==VDT_NUMBER || tmpItem.GetType()==VDT_ARRAY_NUMBER)
		&& (tmpItem2.GetType()==VDT_NUMBER || tmpItem2.GetType()==VDT_ARRAY_NUMBER)
	  )
		return tmpItem.ToFloat() <= tmpItem2.ToFloat();
	
	return tmpItem.ToString() <= tmpItem2.ToString();
} 
BOOL AFXAPI operator!(CVarItem & tmpItem)
{
	return ! tmpItem.ToBool();
} 

BOOL AFXAPI operator||(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	return tmpItem.ToBool() || tmpItem2.ToBool() ;
} 
BOOL AFXAPI operator&&(CVarItem & tmpItem,CVarItem & tmpItem2)
{
	return tmpItem.ToBool() && tmpItem2.ToBool() ;
} 

//-----------------------------------------------------------------------------------
CFormulaModule::CFormulaModule()
{
	nFormulaSum = 0;
	nCurVarISN  =VARISN_START;
	nCurTempISN =TEMPISN_START;
	nCurConstISN=CONSTISN_START;
	vRetType = VDT_VOID;
	nPrmSum = 0;

	nSourceLen=0;
	szSource=NULL;
    pParentModule = NULL;
}

CFormulaModule::~CFormulaModule()
{
	Release();
}

void CFormulaModule::Reset()
{	
	nCurVarISN  =VARISN_START;
	nCurTempISN =TEMPISN_START;
	nCurConstISN=CONSTISN_START;
	vRetType = VDT_VOID;
	varTable.RemoveAll(); 
	nFormulaSum = 0;
	nPrmSum = 0;
}

void CFormulaModule::Release()
{	

⌨️ 快捷键说明

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