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:
alex 1996-08-20 11:00:08 +00:00
parent 359df46fdb
commit 175a2a686e
2 changed files with 44 additions and 3 deletions

View File

@ -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:

View File

@ -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: