d1298ebfb2
git-svn-id: svn://10.65.10.50/trunk@2562 c028cbd2-c16b-5b4b-a496-9718f37d4682
441 lines
14 KiB
C++
Executable File
441 lines
14 KiB
C++
Executable File
#ifndef __EXPR_H
|
|
#define __EXPR_H
|
|
|
|
#ifndef __STRINGS_H
|
|
#include <strings.h>
|
|
#endif
|
|
|
|
#ifndef __REAL_H
|
|
#include <real.h>
|
|
#endif
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @enum TCodesym | Lista di simboli/istruzioni possibili
|
|
enum TCodesym {
|
|
_invalid, // @emem Simbolo non riconosciuto
|
|
_endsym, // @emem Segnaposto per simbolo finale
|
|
_comma, // @emem Simbolo virgola ","
|
|
_lpar, // @emem Simbolo aperta parentesi "("
|
|
_rpar, // @emem Simbolo chiusa parentesi ")"
|
|
_variable, // @emem Nome di una variabile
|
|
_number, // @emem Numero
|
|
_string, // @emem Stringa
|
|
_plus, // @emem Simbolo piu' "+"
|
|
_minus, // @emem Simbolo meno "-"
|
|
_multiply, // @emem Simbolo per "*"
|
|
_divide, // @emem Simbolo diviso "/"
|
|
_chgs, // @emem MENO unario
|
|
_and, // @emem AND logico
|
|
_or, // @emem OR logico
|
|
_not, // @emem NOT logico
|
|
_equal, // @emem Simbolo uguale "="
|
|
_match, // @emem Confronto tra stringhe con wildcards
|
|
_noteq, // @emem Simbolo diverso "!="
|
|
_lt, // @emem Simbolo minore "<lt>"
|
|
_gt, // @emem Simbolo maggiore "<gt>"
|
|
_lteq, // @emem Simbolo minore o uguale "<lt>="
|
|
_gteq, // @emem Simbolo maggiore o uguale "<gt>="
|
|
_sqrt, // @emem Radice quadrata
|
|
_sqr, // @emem Elevamento al quadrato
|
|
_exp10, // @emem Funzione 10 a potenza
|
|
_exp, // @emem Funzione e (nepero) elevato a
|
|
_log10, // @emem Logaritmo in base 10
|
|
_log, // @emem Logaritmo naturale
|
|
_sin, // @emem Funzione seno
|
|
_cos, // @emem Funzione coseno
|
|
_tan, // @emem Funzione tangente
|
|
_left, // @emem Primi caratteri di una stringa
|
|
_right, // @emem Ultimi caratteri di una stringa
|
|
_pow, // @emem Elevamento a potenza
|
|
_min, // @emem Minimo tra piu' elementi
|
|
_max, // @emem Massimo tra piu' elementi
|
|
_mid, // @emem Media degli elementi
|
|
_upper, // @emem Trasformazione in maiuscolo
|
|
_round, // @emem Arrotondamento
|
|
_ansi } ; // @emem Data in ansi
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @enum TTypeexp | Tipi di espressioni definiti
|
|
enum TTypeexp {
|
|
_numexpr, // @emem Espressione numerica
|
|
_strexpr } ; // @emem Espressione in lettere
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @class TValue | Classe per la definizione dei valori che possono essere assunti
|
|
// dai termini di una espressione o il valore dell'espressione stessa
|
|
//
|
|
// @base public | TObject
|
|
class TValue : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
{
|
|
// @access:(INTERNAL) Private Member
|
|
|
|
// @cmember:(INTERNAL) Valore real
|
|
real _r;
|
|
// @cmember:(INTERNAL) Valore in formato stringa
|
|
TString _s;
|
|
|
|
// @access Public Member
|
|
public:
|
|
// @cmember Assegnamento tra oggetti TValue
|
|
TValue& operator =(const TValue& val)
|
|
{ _s = val._s; _r = val._r; return *this;}
|
|
// @cmember Ritorna il valore numerico
|
|
const real& number() const
|
|
{ return _r;}
|
|
// @cmember Ritorna il valore come stringa
|
|
const char* string() const
|
|
{ return (const char*) _s;}
|
|
// @cmember Setta il valore passato come real
|
|
void set(const real& val)
|
|
{ _r = val; _s = val.string();}
|
|
// @cmember Setta il valore passato come stringa
|
|
void set(const char* val)
|
|
{ _s = val; _r = real(val);}
|
|
|
|
// @cmember Costruttore. Inizializza TValue con un reale
|
|
TValue(const real& val);
|
|
// @cmember Costruttore. Inizializza TValue con una stringa
|
|
TValue(const char* val)
|
|
{ _s = val; _r = real(val);}
|
|
// @cmember Costruttore. Inizializza TValue con un altro TValue
|
|
TValue(const TValue& val)
|
|
{ *this = val; }
|
|
// @cmember Costruttore. Inizializza TValue a 0,0 e ""
|
|
TValue() { _r = 0.00; _s = ""; }
|
|
// @cmember Distruttore
|
|
virtual ~TValue()
|
|
{}
|
|
};
|
|
|
|
|
|
#ifdef __EXPR_CPP
|
|
#define extern
|
|
#endif
|
|
|
|
extern TValue nulltvalue;
|
|
|
|
#undef extern
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @class TCode | Classe per la ridefinizione di una espressione in
|
|
// notazione polacca inversa (RPN)
|
|
//
|
|
// @base public | TObject
|
|
class TCode : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
|
|
// @access:(INTERNAL) Private Member
|
|
{
|
|
|
|
// @cmember:(INTERNAL) Simbolo-istruzione-codice
|
|
TCodesym _sym;
|
|
// @cmember:(INTERNAL) Valore
|
|
TValue _val;
|
|
|
|
// @access Public Member
|
|
public:
|
|
// @cmember Assegnamento tra oggetti TCode
|
|
TCode& operator =(const TCode& b);
|
|
// @cmember Inizializza simbolo e valore
|
|
void set(TCodesym sym, const TValue& val = nulltvalue)
|
|
{ _sym = sym; _val = val; }
|
|
// @cmember Ritorna il simbolo
|
|
TCodesym getsym() const
|
|
{ return _sym;}
|
|
// @cmember Ritorna il valore come <c real>
|
|
const real& number() const
|
|
{ return _val.number();}
|
|
// @cmember Ritorna il valore come stringa
|
|
const char* string() const
|
|
{ return _val.string();}
|
|
|
|
// @cmember Costruttore, inizializza simbolo con "invalid", valore a nullvalue
|
|
TCode()
|
|
{set(_invalid);}
|
|
// @cmember Costruttore
|
|
TCode(TCodesym sym, const TValue& val = nulltvalue)
|
|
// @cmember Costruttore, inizializza simbolo con <p sym> e valore con <p val>
|
|
{ set(sym, val);}
|
|
// @cmember Distruttore
|
|
virtual ~TCode()
|
|
{}
|
|
};
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @class TCodearray | Classe per la definizione di un array di istruzioni da valutare
|
|
// passo per passo in una espressione
|
|
//
|
|
// @base public | TObject
|
|
class TCodearray : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
|
|
// @access:(INTERNAL) Private Member
|
|
{
|
|
|
|
// @cmember:(INTERNAL) Numero di istruzioni
|
|
int _last;
|
|
// @cmember:(INTERNAL) Puntatore all'istruzione corrente (Istruction pointer)
|
|
int _ip;
|
|
// @cmember:(INTERNAL) Array
|
|
TArray _rpn;
|
|
|
|
// @access Public Member
|
|
public:
|
|
// @cmember Cancella contenuto array
|
|
void clear();
|
|
// @cmember Aggiunge un'istruzione all'array
|
|
void add(TCodesym sym, const TValue& val = nulltvalue);
|
|
// @cmember Posiziona all'inizio il puntatore all'istruzione corrente
|
|
void begin()
|
|
{ _ip = 0;}
|
|
// @cmember Incrementa l'istruction pointer
|
|
TCode& step()
|
|
{ return (TCode&) _rpn[end() ? _ip : _ip++];}
|
|
// @cmember Ritorna TRUE se l'istruction pointer ha raggiunto il simbolo di fine codice
|
|
bool end() const
|
|
{ return ((TCode&) _rpn[_ip]).getsym() == _endsym;}
|
|
// @cmember Sposta indietro l'istruction pointer di <p step> passi (si ferma
|
|
// quando trova l'inizio del puntatore)
|
|
void backtrace(int step = 1)
|
|
{ if (_ip > step) _ip -= step; else begin(); }
|
|
// @cmember Costruttore. Crea un array di 10 elementi
|
|
TCodearray(int size = 50);
|
|
// @cmember Distruttore
|
|
virtual ~TCodearray()
|
|
{}
|
|
};
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @class TVar | Classe per la definizione delle variabile delle espressioni
|
|
//
|
|
// @base public | TObject
|
|
class TVar : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
|
|
// @access:(INTERNAL) Private Member
|
|
{
|
|
|
|
// @cmember:(INTERNAL) Nome della variabile
|
|
TString _name;
|
|
// @cmember:(INTERNAL) Valore assegnato alla variabile
|
|
TValue _val;
|
|
|
|
// @access Public Member
|
|
public:
|
|
|
|
// @cmember Assegnamento di una stringa all'oggetto Tval
|
|
const char* operator =(const char* val)
|
|
{ _val.set(val); return val;}
|
|
// @cmember Assegnamento di un numero all'oggetto TVal
|
|
const real& operator =(const real& val)
|
|
{ _val.set(val); return val;}
|
|
// @cmember Assegamento di un oggetto <c TValue>
|
|
TVar& operator =(const TValue& val)
|
|
{ _val = val; return *this;}
|
|
// @cmember Assegnamento tra oggetti TVal
|
|
TVar& operator =(const TVar& var)
|
|
{ _name = var._name ; _val = var._val; return *this;}
|
|
// @cmember Setta l'oggetto TVal con il nome e il valore passati
|
|
void set(const char* name, const TValue& val = nulltvalue)
|
|
{ _name = name ; _val = val;}
|
|
// @cmember Setta a name il nome della variabile
|
|
void setname(const char* name)
|
|
{ _name = name;}
|
|
// @cmember Ritorna il nome della variabile
|
|
const char* getname() const
|
|
{ return _name;}
|
|
|
|
// @cmember Ritorna iv valore assgnato alla variabile (un <c TValue>)
|
|
operator TValue&()
|
|
{ return _val;}
|
|
// @cmember Ritorna il valore real della variabile
|
|
const real& number() const
|
|
{ return _val.number();}
|
|
// @cmember Ritorna il valore stringa della variabile
|
|
const char* string() const
|
|
{ return _val.string();}
|
|
|
|
// @cmember Costruttore (assegna "" ed il valore nulltvalue)
|
|
TVar()
|
|
{ _name = ""; _val = nulltvalue;}
|
|
// @cmember Costruttore (assegna nome e valore passato)
|
|
TVar(const char* name, const TValue& val = nulltvalue)
|
|
{ _name = name; _val = val;}
|
|
// @cmember Costruttore (assegna l'oggetto TVal passato)
|
|
TVar(TVar& v)
|
|
{ _name = v._name; _val = v._val;}
|
|
// @cmember Distruttore
|
|
virtual ~TVar()
|
|
{}
|
|
};
|
|
|
|
// @doc INTERNAL
|
|
|
|
// @class TVararray | Classe per la definizione di un array di variabili da
|
|
// valutare nell'esspressione
|
|
//
|
|
// @base public | TObject
|
|
class TVararray : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
|
|
// @access:(INTERNAL) Private Member
|
|
{
|
|
|
|
// @cmember:(INTERNAL) Numero di variabili
|
|
int _last;
|
|
// @cmember:(INTERNAL) Array
|
|
TArray _array;
|
|
|
|
// @access Public Member
|
|
public:
|
|
// @cmember Cancella il contenuto dell'array
|
|
void clear()
|
|
{ _last = 0; }
|
|
// @cmember Aggiunge un oggetto TVar
|
|
void add(const TVar& var);
|
|
// @cmember Aggiunge un nome di variabile e il suo valore
|
|
void add(const char* name, const TValue& val = nulltvalue);
|
|
// @cmember Ritorna il nome della variabile di posto varnum
|
|
const char* varname(int varnum) const
|
|
{ return varnum < _array.items() ? ((TVar&) _array[varnum]).getname() : "";}
|
|
|
|
// @cmember Setta l'oggetto TVararray con il nome e il valore della variabile
|
|
void set(const char* varname, const real& val);
|
|
// @cmember Setta l'oggetto TVararray con il nome e il valore della variabile
|
|
// (passato come stringa)
|
|
void set(const char* varname, const char* val);
|
|
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
|
void set(int varnum, const real& val)
|
|
{ if (varnum < _array.items()) ((TVar&) _array[varnum]) = val;}
|
|
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
|
// come stringa
|
|
void set(int varnum, const char* val)
|
|
{ if (varnum < _array.items()) ((TVar&) _array[varnum]) = val;}
|
|
|
|
// @cmember Ritorna il valore della variabile con nome <p varname>
|
|
const real& getnum(const char* varname);
|
|
// @cmember Ritorna il valore della variabile di posto <p varnum>-esimo
|
|
const real& getnum(int varnum);
|
|
// @cmember Ritorna il nome della variabile con nome <p varname>
|
|
const char* getstring(const char* varname);
|
|
// @cmember Ritorna il nome della variabile di posto <p varnum>-esimo
|
|
const char* getstring(int varnum);
|
|
|
|
// @cmember Ritorna il numero di variabili utilizzate
|
|
int numvar() const
|
|
{ return _last;}
|
|
|
|
// @cmember Costruttore
|
|
TVararray(int size = 10);
|
|
// @cmember Distruttore
|
|
virtual ~TVararray()
|
|
{}
|
|
};
|
|
|
|
// @doc EXTERNAL
|
|
|
|
// @class TExpression | Classe per la interpretazione e valutazione di espressioni
|
|
// numerica e di stringhe
|
|
//
|
|
// @base public | TObject
|
|
class TExpression : public TObject
|
|
|
|
// @author:(INTERNAL) Sandro
|
|
|
|
// @access:(INTERNAL) Private Member
|
|
{
|
|
|
|
// @cmember:(INTERNAL) Array di codice
|
|
TCodearray _code;
|
|
// @cmember:(INTERNAL) Array di variabili
|
|
TVararray _var;
|
|
// @cmember:(INTERNAL) Valore dell'espressione
|
|
TValue _val;
|
|
// @cmember:(INTERNAL) TRUE se l'espressione e' stata modificata
|
|
bool _dirty;
|
|
// @cmember:(INTERNAL) Tipo dell'espressione
|
|
TTypeexp _type;
|
|
// @cmember:(INTERNAL) Stringa originale
|
|
TString _original;
|
|
|
|
// @access Protected Member
|
|
protected:
|
|
// @cmember Valuta (calcola) l'espressione
|
|
void eval();
|
|
// @cmember Ritorna il prossimo token dell'espressione (se <p reduct> e' TRUE interpreta
|
|
// la virgola come un token)
|
|
TCodesym __gettoken(bool reduct = FALSE);
|
|
// @cmember Ritorna il prossimo fattore
|
|
TCodesym __factor(TCodesym startsym);
|
|
// @cmember Ritorna il prossimo termine
|
|
TCodesym __term(TCodesym startsym);
|
|
// @cmember Ritorna la prossima espressione
|
|
TCodesym __expression(TCodesym startsym);
|
|
// @cmember Compila l'espressione
|
|
bool compile(const char* expression, TTypeexp type);
|
|
|
|
protected: // TObject
|
|
// @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
|
|
virtual void print_on(ostream& out) const ;
|
|
|
|
// @access Public Member
|
|
public:
|
|
// @cmember operator const | real& | | Ritorna il valore real dell'espressione
|
|
operator const real&();
|
|
// @cmember operator const | char* | | Ritorna il valore dell'espressione come stringa
|
|
operator const char*();
|
|
// @cmember Ritorna il valore dell'espressione come booleano
|
|
operator bool();
|
|
// @cmember Ritorna il nome della variabile di posto <p varnum>
|
|
const char* varname(int varnum) const
|
|
{ return _var.varname(varnum); }
|
|
// @cmember Ritorna il numero di variabili nell'espressione
|
|
int numvar() const
|
|
{ return _var.numvar(); }
|
|
// @cmember Ritorna il tipo dell'espressione
|
|
const TTypeexp type() const
|
|
{ return _type; }
|
|
// @cmember Ritorna l'array del codice
|
|
TCodearray& code() const
|
|
{ return (TCodearray&)_code; }
|
|
// @cmember Ritorna l'array di variabili
|
|
const TVararray& vars() const
|
|
{ return _var; }
|
|
|
|
// @cmember Setta la variabile con nome e numero
|
|
void setvar(const char* varname, const real& val);
|
|
// @cmember Setta la variabile con poszione e numero
|
|
void setvar(int varnum, const real& val);
|
|
// @cmember Setta la variabile con nome e valore passato come stringa
|
|
void setvar(const char* varname, const char* val);
|
|
// @cmember Setta la variabile passato co poszione e numero passato come stringa
|
|
void setvar(int varnum, const char* val);
|
|
// @cmember Setta il tipo dell'espressione
|
|
void set_type(const TTypeexp type)
|
|
{ _type = type; }
|
|
// @cmember Setta l'espressione e la compila (ritorna il risultato della compilazione)
|
|
bool set(const char* expression, TTypeexp type = _numexpr);
|
|
|
|
// @cmember Costruttore (assegna l'estressione e il suo tipo)
|
|
TExpression(const char* expression, TTypeexp type = _numexpr);
|
|
// @cmember Costruttore (assegna il tipo dell'istruzione)
|
|
TExpression(TTypeexp type = _numexpr);
|
|
// @cmember Distruttore
|
|
virtual ~TExpression()
|
|
{}
|
|
};
|
|
|
|
#endif // __EXPR_H
|