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