// Function.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "math.h"
#include "express.h"
#include <ctype.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_SERIAL(CExpression, CObject, 0)
//////////////////////////////////////////////////////////////////////
// CExpression Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Variabile Globale
//parametrii Global(50);
/////////////////////////////////////////////////////////////////////////////////
// Eliberarea memorie ocupate de arbore
void CExpression::elibmem ( arbore a)
{
if (a==NULL) return;
if (a->left!=NULL) elibmem(a->left);
if (a->right!=NULL) elibmem(a->right);
if (a->operatie == '`')
delete a->valoarestr;
delete a;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CExpression::CExpression()
{
m_Arbore = NULL;
m_definitie = "";
pozitie = 0;
m_pvariabile = NULL;
}
CExpression::CExpression(CMapVariabile * vars)
{
m_Arbore = NULL;
m_definitie = "";
pozitie = 0;
m_pvariabile = vars;
}
CExpression::~CExpression()
{
elibmem (m_Arbore);
}
void CExpression::Serialize(CArchive & ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar << m_definitie;
}
else
{
// TODO: add loading code here
ar >> m_definitie;
m_Arbore = NULL;
pozitie = 0;
UpdateArbore();
// After loading this object if it contains variables you should atach a variable
// Table to it
}
}
int CExpression::UpdateArbore()
{
if (m_definitie.IsEmpty())
return 0;
elibmem(m_Arbore); // Eliberarea memoriei ocupate de arbore
m_Arbore = NULL;
pozitie = 0;
m_Arbore = expresie();
if (m_definitie[pozitie]!='\0')
{
elibmem(m_Arbore);
m_Arbore = NULL;
}
if (m_Arbore == NULL)
return pozitie;
else return -1;
}
CExpression::arbore CExpression::expresie()
{
arbore nod;
arbore arb1 = termen();
arbore arb2;
if (arb1 == NULL) return NULL; // In caz de eroare terminate
while ((m_definitie[pozitie]=='-') || (m_definitie[pozitie]=='+'))
{
nod=new NOD;
nod->left=arb1;
nod->operatie=m_definitie[pozitie];
pozitie++;
arb2 = termen();
nod->right=arb2;
if (arb2 == NULL)
{
elibmem(nod);
return NULL; // In caz de eroare terminate
}
arb1 = nod;
}
return arb1;
}
CExpression::arbore CExpression::termen()
{
arbore nod;
arbore arb1 = putere();
arbore arb2;
if (arb1 == NULL) return NULL; // In caz de eroare terminate
while ((m_definitie[pozitie]=='*') || (m_definitie[pozitie]=='/'))
{
nod=new NOD;
nod->left=arb1;
nod->operatie=m_definitie[pozitie];
pozitie++;
arb2 = putere();
nod->right=arb2;
if (arb2 == NULL)
{
elibmem(nod);
return NULL; // In caz de eroare terminate
}
arb1 = nod;
}
return arb1;
}
CExpression::arbore CExpression::putere()
{
arbore nod = NULL;
arbore arb1 = logicalOp();
arbore arb2;
if (arb1 == NULL) return NULL; // In caz de eroare terminate
while (m_definitie[pozitie]=='^')
{
nod=new NOD;
nod->left=arb1;
nod->operatie=m_definitie[pozitie];
pozitie++;
arb2 = logicalOp();
nod->right=arb2;
if (arb2 == NULL)
{
elibmem(nod);
return NULL; // In caz de eroare terminate
}
arb1 = nod;
}
return arb1;
}
CExpression::arbore CExpression::factor()
{
arbore nod = NULL,nod2 = NULL,left = NULL;
while(m_definitie[pozitie] == ' ' && m_definitie[pozitie] != '\0')
pozitie++;
if (m_definitie[pozitie]=='-')
{
nod = new NOD;
left = new NOD;
left->right=NULL;
left->left=NULL;
left->operatie='@';
left->valoare=-1;
nod->left=left;
nod->operatie='*';
pozitie++;
nod->right = expresie();
if (nod->right == NULL) return NULL;
return nod;
}
if (m_definitie[pozitie]=='(')
{
pozitie++;
nod = expresie();
if (nod == NULL) return NULL;
if (m_definitie[pozitie]!=')')
{
elibmem(nod);
return NULL;
}
pozitie++;
return nod;
}
else if (m_definitie[pozitie]=='|')
{
pozitie++;
nod2 = expresie();
if (nod2 == NULL) return NULL;
if (m_definitie[pozitie]!='|')
{
elibmem(nod);
return NULL;
}
nod = new NOD;
nod->left=nod2;
nod->right=NULL;
nod->operatie='|';
pozitie++;
return nod;
}
else return identificator();
return nod;
}
CExpression::arbore CExpression::identificator()
{
int poz;
arbore nod = NULL,nod2 = NULL;
arbore result = NULL;
poz=pozitie;
SkipSpaces();
if (m_definitie[pozitie]=='\0') result = NULL;
if (isdigit(m_definitie[pozitie])) // Este numar ?
{
while ((isdigit(m_definitie[pozitie]) || (m_definitie[pozitie]=='.')))
pozitie++;
nod = new NOD;
nod->left = NULL;
nod->right = NULL;
nod->operatie = '@';
#ifdef UNICODE
nod->valoare = _wtof(m_definitie.Mid(poz,pozitie-poz));
#else
nod->valoare = atof(m_definitie.Mid(poz,pozitie-poz));
#endif
result = nod;
}
if (isalpha(m_definitie[pozitie])) // Am i an identifier ?
{
while (isalnum(m_definitie[pozitie]))
pozitie++;
CString id = m_definitie.Mid(poz,pozitie-poz);
CString nid = id;
id.MakeUpper();
if (id =="SIN") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=150;
SkipSpaces();
return nod;
}
if (id =="COS") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=151;
SkipSpaces();
return nod;
}
if (id =="EXP") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=152;
SkipSpaces();
return nod;
}
if (id =="SQRT") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=153;
SkipSpaces();
return nod;
}
if (id =="LOG") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=154;
SkipSpaces();
return nod;
}
if (id =="TG") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=155;
SkipSpaces();
return nod;
}
if (id =="CTG") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=156;
SkipSpaces();
return nod;
}
if (id =="ASIN") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=157;
SkipSpaces();
return nod;
}
if (id =="ACOS") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=158;
SkipSpaces();
return nod;
}
if (id =="ATG") // Functia sinus CString
{
nod2 = factor();
nod = new NOD;
nod->left = nod2;
nod->right=NULL;
nod->operatie=159;
SkipSpaces();
return nod;
}
CValue *valoare;
if (m_pvariabile->Lookup(nid,valoare))
{
nod = new NOD;
nod -> left = NULL;
nod -> right = NULL;
nod -> operatie = '`';
nod -> valoarestr = new CString(nid);
result = nod;
}
else
result = NULL;
}
SkipSpaces();
return result;
}
int CExpression::ChangeExpression(CString & expresie)
{
m_definitie = expresie + '\0' + '\0';
ret