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
					
				@ -190,6 +190,14 @@ TExpression::operator const char*()
 | 
				
			|||||||
void TExpression::print_on(ostream& out) const       
 | 
					void TExpression::print_on(ostream& out) const       
 | 
				
			||||||
{ out << _original; }
 | 
					{ 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()
 | 
					TExpression::operator bool()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -425,6 +433,13 @@ void TExpression::eval()
 | 
				
			|||||||
        evalstack.push(real((o1 >= o2) ? 1.0 : 0.0));
 | 
					        evalstack.push(real((o1 >= o2) ? 1.0 : 0.0));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;  
 | 
					      break;  
 | 
				
			||||||
 | 
					    case _userfunc: 
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        const int nparms = (int) ((real &) evalstack.pop()).integer();
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        evaluate_user_func(instr.string(), nparms, evalstack);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    case _sqrt:
 | 
					    case _sqrt:
 | 
				
			||||||
      evalstack.push(real(sqrt((real&) evalstack.pop())));
 | 
					      evalstack.push(real(sqrt((real&) evalstack.pop())));
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
@ -587,6 +602,9 @@ TCodesym TExpression::__gettoken(bool reduct)
 | 
				
			|||||||
    s.lower();
 | 
					    s.lower();
 | 
				
			||||||
    for ( int j = 0; _fntable[j] != NULL; j++)
 | 
					    for ( int j = 0; _fntable[j] != NULL; j++)
 | 
				
			||||||
      if (s  == _fntable[j])  return _fntok[j];
 | 
					      if (s  == _fntable[j])  return _fntok[j];
 | 
				
			||||||
 | 
					    for (const char * p = _s; *p && *p == ' '; p++);
 | 
				
			||||||
 | 
					    if (*p == '(')
 | 
				
			||||||
 | 
					     return _userfunc; 
 | 
				
			||||||
    return _variable;
 | 
					    return _variable;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  switch (*_s)
 | 
					  switch (*_s)
 | 
				
			||||||
@ -708,6 +726,25 @@ TCodesym TExpression::__factor(TCodesym startsym)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
    sym = __gettoken(TRUE);
 | 
					    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 _sqrt:
 | 
				
			||||||
  case _sqr:
 | 
					  case _sqr:
 | 
				
			||||||
  case _exp10:
 | 
					  case _exp10:
 | 
				
			||||||
 | 
				
			|||||||
@ -36,6 +36,7 @@ enum TCodesym {
 | 
				
			|||||||
  _gt,             // @emem Simbolo maggiore "<gt>"
 | 
					  _gt,             // @emem Simbolo maggiore "<gt>"
 | 
				
			||||||
  _lteq,           // @emem Simbolo minore o uguale "<lt>="
 | 
					  _lteq,           // @emem Simbolo minore o uguale "<lt>="
 | 
				
			||||||
  _gteq,           // @emem Simbolo maggiore o uguale "<gt>="
 | 
					  _gteq,           // @emem Simbolo maggiore o uguale "<gt>="
 | 
				
			||||||
 | 
					  _userfunc,       // @emem Funzione utente non definita chiamera' la .... in esecuzione
 | 
				
			||||||
  _sqrt,           // @emem Radice quadrata
 | 
					  _sqrt,           // @emem Radice quadrata
 | 
				
			||||||
  _sqr,            // @emem Elevamento al quadrato
 | 
					  _sqr,            // @emem Elevamento al quadrato
 | 
				
			||||||
  _exp10,          // @emem Funzione 10 a potenza
 | 
					  _exp10,          // @emem Funzione 10 a potenza
 | 
				
			||||||
@ -344,6 +345,8 @@ public:
 | 
				
			|||||||
  {}
 | 
					  {}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
               
 | 
					               
 | 
				
			||||||
 | 
					class TStack;
 | 
				
			||||||
 | 
					               
 | 
				
			||||||
// @doc EXTERNAL
 | 
					// @doc EXTERNAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// @class TExpression | Classe per la interpretazione e valutazione di espressioni
 | 
					// @class TExpression | Classe per la interpretazione e valutazione di espressioni
 | 
				
			||||||
@ -389,6 +392,7 @@ protected:
 | 
				
			|||||||
protected: // TObject
 | 
					protected: // TObject
 | 
				
			||||||
  // @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
 | 
					  // @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
 | 
				
			||||||
  virtual void print_on(ostream& out) const ;
 | 
					  virtual void print_on(ostream& out) const ;
 | 
				
			||||||
 | 
					  virtual void evaluate_user_func(const char * name, int nparms, TStack & stack);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // @access Public Member
 | 
					  // @access Public Member
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user