Exemplo n.º 1
0
void NMParser_::translate(nvar& n){
  if(n.isSymbol()){
    SymbolMap::const_iterator itr = _symbolMap.find(n.str());
    
    SymbolKey key = itr->second;
    
    switch(key){
      case SKEY_True:
        n = true;
        break;
      case SKEY_False:
        n = false;
        break;
      case SKEY_E:
        n.str() = "Eu";
        break;
      default:
        break;
    }
    return;
  }
  
  size_t size = n.size();
  
  FunctionMap::const_iterator itr = _functionMap.find({n.str(), size});
  
  if(itr == _functionMap.end()){
    itr = _functionMap.find({n.str(), -1});
  }
  
  if(itr == _functionMap.end()){
    error(n, "unrecognized function: " + n);
    return;
  }
  
  FunctionKey key = itr->second;
  
  switch(key){
    case FKEY_Set_2:
    case FKEY_Mod_2:
    case FKEY_Not_1:
    case FKEY_And_2:
    case FKEY_Or_2:
    case FKEY_Exp_1:
    case FKEY_Sqrt_1:
    case FKEY_Abs_1:
    case FKEY_Log_1:
    case FKEY_Cos_1:
    case FKEY_Sin_1:
    case FKEY_Sinh_1:
    case FKEY_Tan_1:
    case FKEY_Tanh_1:
    case FKEY_Integrate_2:
    case FKEY_GCD_n:
    case FKEY_LCM_n:
    case FKEY_Factorial_1:
      return;
    case FKEY_Times_n:
      if(size < 2){
        break;
      }
      
      n.str() = "Mul";
      n.foldRight();
      return;
    case FKEY_Plus_n:
      if(size < 2){
        break;
      }
      
      n.str() = "Add";
      n.foldRight();
      return;
    case FKEY_Power_2:
      n.str() = "Pow";
      return;
    case FKEY_Rational_2:
      n = nrat(n[0], n[1]);
      return;
    case FKEY_Less_2:
      n.str() = "LT";
      return;
    case FKEY_Greater_2:
      n.str() = "GT";
      return;
    case FKEY_LessEqual_2:
      n.str() = "LE";
      return;
    case FKEY_GreaterEqual_2:
      n.str() = "GE";
      return;
    case FKEY_Equal_2:
      n.str() = "EQ";
      return;
    case FKEY_Unequal_2:
      n.str() = "NE";
      return;
    case FKEY_Increment_1:
      n.str() = "PostInc";
      return;
    case FKEY_PreIncrement_1:
      n.str() = "Inc";
      return;
    case FKEY_Decrement_1:
      n.str() = "PostDec";
      return;
    case FKEY_PreDecrement_1:
      n.str() = "Dec";
      return;
    case FKEY_ArcCos_1:
      n.str() = "Acos";
      return;
    case FKEY_Cosh_1:
      n.str() = "Cosh";
      return;
    case FKEY_ArcSin_1:
      n.str() = "Asin";
      return;
    case FKEY_ArcTan_1:
      n.str() = "Atan";
      return;
    case FKEY_D_2:
      n.str() = "Derivative";
      return;
    case FKEY_List_n:{
      size_t size = n.size();
      nvar v;

      for(size_t i = 0; i < size; ++i){
        v << move(n[i]);
      }
      
      n = move(v);
      return;
    }
  }
  
  error(n, "unrecognized function: " + n);
}