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 + -
显示快捷键?