Exemplo n.º 1
0
void
Len (Token ** Pila)
{

  Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila);
  if (Buzon.GetHuboError ())
    return;
  if (NoEsString (Operando))
    {
      BorrarTokenSiEsVariable (Operando);
      return;
    }
  long double ValorRetorno = (long double) strlen (Operando->GetDatoStr ());
  BorrarTokenSiEsVariable (Operando);
  Token *TokenRetorno = ConsigueToken (ValorRetorno);
  if (Buzon.GetHuboError ())
    return;
  delete Desapila (Pila);
  Apila (Pila, TokenRetorno);
  return;

}
Exemplo n.º 2
0
/* We do touch orig. */
void VariableVector::AlmacenaVectorInternal(char *Cadena)
{
  int Largo = strlen (Cadena);

  int ActualChar = 0;
  for (; ActualChar < Largo && (Cadena[ActualChar] != '('); ++ActualChar);
  char tmp = Cadena[ActualChar];
  Cadena[ActualChar] = 0;
  Token *t = GetPostfijo (Cadena);
  Cadena[ActualChar] = tmp;

  if (Buzon.GetHuboError ())
    return;

  if (!t)
    {
      //Uso ilegal de la coma o cadena vacia; un error pa'l buzon
      Buzon.Error (ILEGAL_COMA_O_CADENA_VACIA);
      return;
    }
  if ((t->GetTipoAlmacenamiento () != VARIABLE) || (t->GetSig ()))
    {
      //Solo se admiten camos variables; un error pa'l buzon
      LiberarListaToken (t);
      Buzon.Error (SOLO_VARIABLES);
      return;
    }

  Identificador = dfd_strdup(t->GetDatoStr());

  delete t;

  if (Cadena[ActualChar] == 0)
    return;

  // Ahora los indices...

  int EsCadena = 0;
  int IniChar = ActualChar + 1, Parent = 1;
  for (++ActualChar; (ActualChar < Largo) && (Parent > 0); ++ActualChar)
    {
      char &Casilla = Cadena[ActualChar];
      if (Casilla == '(' && !EsCadena)
        ++Parent;
      if (Casilla == ')' && !EsCadena)
        --Parent;
      if (Casilla == '\'')
        EsCadena = 1 - EsCadena;

      if (!EsCadena && (((Casilla == ',') && (Parent == 1))
                        || ((Casilla == ')') && (!Parent))))
        {
          char Temp = Casilla;
          Casilla = 0;
          t = GetPostfijo (Cadena + IniChar);
          Casilla = Temp;
          IniChar = ActualChar + 1;
          if (Buzon.GetHuboError ())
            return;
          if (!t)
            {
              //Uso ilegal de la coma o cadena vacia; un error pa'l buzon
              Buzon.Error (ILEGAL_COMA_O_CADENA_VACIA);
              return;
            }
          Lista.Insertar (t);
        }
    }
  if (Parent)
    {
      //No se cerraron todos los parentesis abiertos; un error pa'l buzon
      Buzon.Error (ABIERTO_PARENTESIS_NO_CERRADO);
      return;
    }
  int n = Lista.GetNItems ();
  if (!n)
    {
      //No hay indices entre los parentesis; un error pa'l buzon
      Buzon.Error (NO_INDICES);
      return;
    }
  VectorIndices = new unsigned int[n];
  if (ActualChar >= Largo)
    return;
  t = GetPostfijo (Cadena + ActualChar);
  if (t)
    // Solo se admiten campos variables; un error pa'l buzon
    Buzon.Error (SOLO_VARIABLES);
  return;
}