From 175a2a686ed9c1dd3d765e80cd78035bf6fe1c88 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 20 Aug 1996 11:00:08 +0000 Subject: [PATCH] Aggiunto supporto per funzioni utente git-svn-id: svn://10.65.10.50/trunk@3410 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/expr.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- include/expr.h | 6 +++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/include/expr.cpp b/include/expr.cpp index f039a4605..772bd8d5a 100755 --- a/include/expr.cpp +++ b/include/expr.cpp @@ -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: diff --git a/include/expr.h b/include/expr.h index 754e94c5c..a790d68bc 100755 --- a/include/expr.h +++ b/include/expr.h @@ -36,6 +36,7 @@ enum TCodesym { _gt, // @emem Simbolo maggiore "" _lteq, // @emem Simbolo minore o uguale "=" _gteq, // @emem Simbolo maggiore o uguale "=" + _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

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