Aggiunto supporto per funzioni utente
git-svn-id: svn://10.65.10.50/trunk@3410 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
359df46fdb
commit
175a2a686e
@ -187,9 +187,17 @@ TExpression::operator const char*()
|
||||
}
|
||||
|
||||
|
||||
void TExpression::print_on(ostream& out) const
|
||||
void TExpression::print_on(ostream& out) const
|
||||
{ out << _original; }
|
||||
|
||||
void TExpression::evaluate_user_func(const char * name, int nparms, TStack & stack)
|
||||
|
||||
{
|
||||
NFCHECK("Unknown function : %s ", name);
|
||||
for ( int i = nparms ; i > 0; i--)
|
||||
stack.pop();
|
||||
stack.push(ZERO);
|
||||
}
|
||||
|
||||
TExpression::operator bool()
|
||||
|
||||
@ -424,6 +432,13 @@ void TExpression::eval()
|
||||
o1 = (real&) evalstack.pop();
|
||||
evalstack.push(real((o1 >= o2) ? 1.0 : 0.0));
|
||||
}
|
||||
break;
|
||||
case _userfunc:
|
||||
{
|
||||
const int nparms = (int) ((real &) evalstack.pop()).integer();
|
||||
|
||||
evaluate_user_func(instr.string(), nparms, evalstack);
|
||||
}
|
||||
break;
|
||||
case _sqrt:
|
||||
evalstack.push(real(sqrt((real&) evalstack.pop())));
|
||||
@ -587,6 +602,9 @@ TCodesym TExpression::__gettoken(bool reduct)
|
||||
s.lower();
|
||||
for ( int j = 0; _fntable[j] != NULL; j++)
|
||||
if (s == _fntable[j]) return _fntok[j];
|
||||
for (const char * p = _s; *p && *p == ' '; p++);
|
||||
if (*p == '(')
|
||||
return _userfunc;
|
||||
return _variable;
|
||||
}
|
||||
switch (*_s)
|
||||
@ -707,7 +725,26 @@ TCodesym TExpression::__factor(TCodesym startsym)
|
||||
if (i == numvar()) _var.add(_tok);
|
||||
}
|
||||
sym = __gettoken(TRUE);
|
||||
break;
|
||||
break;
|
||||
case _userfunc:
|
||||
{
|
||||
TValue val (_tok);
|
||||
|
||||
sym = __gettoken();
|
||||
if (sym == _lpar)
|
||||
{
|
||||
int nparms = 0;
|
||||
while ((sym = __expression(sym)) != _rpar && sym == _comma)
|
||||
nparms++;
|
||||
if (sym == _rpar)
|
||||
{
|
||||
_code.add(_number, real(nparms));
|
||||
_code.add(startsym, val);
|
||||
sym = __gettoken();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case _sqrt:
|
||||
case _sqr:
|
||||
case _exp10:
|
||||
|
@ -36,6 +36,7 @@ enum TCodesym {
|
||||
_gt, // @emem Simbolo maggiore "<gt>"
|
||||
_lteq, // @emem Simbolo minore o uguale "<lt>="
|
||||
_gteq, // @emem Simbolo maggiore o uguale "<gt>="
|
||||
_userfunc, // @emem Funzione utente non definita chiamera' la .... in esecuzione
|
||||
_sqrt, // @emem Radice quadrata
|
||||
_sqr, // @emem Elevamento al quadrato
|
||||
_exp10, // @emem Funzione 10 a potenza
|
||||
@ -343,7 +344,9 @@ public:
|
||||
virtual ~TVararray()
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
class TStack;
|
||||
|
||||
// @doc EXTERNAL
|
||||
|
||||
// @class TExpression | Classe per la interpretazione e valutazione di espressioni
|
||||
@ -389,6 +392,7 @@ protected:
|
||||
protected: // TObject
|
||||
// @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
|
||||
virtual void print_on(ostream& out) const ;
|
||||
virtual void evaluate_user_func(const char * name, int nparms, TStack & stack);
|
||||
|
||||
// @access Public Member
|
||||
public:
|
||||
|
Loading…
x
Reference in New Issue
Block a user