@Override
  public void visit(Call callExp) {
    if (callExp.getCallee() != null) callExp.getCallee().accept(this);
    System.out.print(".");
    if (callExp.getMethodName() != null) callExp.getMethodName().accept(this);
    System.out.print("(");

    if (callExp.getArgs() != null) {
      for (int i = 0; i < callExp.getArgs().size(); i++) {
        if (callExp.getArgs().elementAt(i) == null) continue;

        callExp.getArgs().elementAt(i).accept(this);
        if (i < callExp.getArgs().size() - 1) System.out.print(", ");
      }
    }

    System.out.print(")");
  }
 @Override
 public void visitar(Call call) {
   // obtengo el codigo graph del nodo call.
   String ident = call.toExtendedGrapher(this.cantNodosVisitados);
   // uno al codigo general.
   this.codigoGraph += ident;
   String[] delimitador = ident.split("\\[");
   // enlazo el nodo con el padre.
   String enlace = this.auxPadres.peek() + "->" + delimitador[0] + "; \n";
   // guardo el enlace en el codigo general.
   this.codigoGraph += enlace;
   // guardo el nuevo nodo en la pila
   this.auxPadres.push(delimitador[0]);
   // cuento como nodo visitado.
   this.cantNodosVisitados++;
   // visito los argumentos.
   for (Nodo argumento : call.getArgs()) {
     argumento.aceptar(this);
   }
   // ya visto el subarbol de call, elimino la raiz .
   this.auxPadres.pop();
 }
  // Exp e;
  // Identifier i;
  // ExpList el;
  public Object visit(Call n) { // Implenetada, mas gambiarral. Se der tempo eu ajeito.
    Object ep = n.e.accept(this);
    n.i.accept(this);

    List<String> pars = new ArrayList<String>(); // Lista de tipos de parâmetros.
    for (int i = 0; i < n.el.size(); i++) {
      Object ep1 = n.el.get(i).accept(this);
      if (ep1 instanceof String) {
        pars.add((String) ep1);
      }
    }
    if (ep instanceof String) {
      String clas = (String) ep;
      if (existeClass(clas)) {
        List<SymbolTuple> listscop = table.getTable().get("Global" + clas);
        for (SymbolTuple sym : listscop) {
          if (sym.getType().equalsIgnoreCase("Method") && sym.getValue().equalsIgnoreCase(n.i.s)) {
            if (sym.getPars() == null && pars.size() == 0) return sym.getArg();
            else {
              if (sym.getPars() != null && sym.getPars().size() == pars.size()) {
                for (int i = 0; i < pars.size(); i++) {
                  String sup2 = getSuperClass(pars.get(i));
                  boolean valida =
                      !(sym.getPars().get(i).equalsIgnoreCase(pars.get(i))
                          || sym.getPars().get(i).equalsIgnoreCase(sup2)); // Tratar a heranca.
                  if (valida) {
                    error.add("Lista de parâmetros incompativeis! Linha: " + n.getLine_number());
                    return null;
                  }
                }
                return sym.getArg();
              } else
                error.add("Lista de parâmetros incompativeis-----! Linha: " + n.getLine_number());
            }
          }
        }
        if (getSuperClass(clas) != null && existeClass(getSuperClass(clas))) { // Na superclasse
          List<SymbolTuple> listscop2 = table.getTable().get("Global" + getSuperClass(clas));
          for (SymbolTuple sym : listscop2) {
            if (sym.getType().equalsIgnoreCase("Method")
                && sym.getValue().equalsIgnoreCase(n.i.s)) {
              if (sym.getPars() == null && pars.size() == 0) return sym.getArg();
              else {
                if (sym.getPars() != null && sym.getPars().size() == pars.size()) {
                  for (int i = 0; i < pars.size(); i++) {
                    String sup2 = getSuperClass(pars.get(i));
                    boolean valida =
                        !(sym.getPars().get(i).equalsIgnoreCase(pars.get(i))
                            || sym.getPars().get(i).equalsIgnoreCase(sup2)); // Tratar a heranca.
                    if (valida) {
                      error.add("Lista de parâmetros incompativeis! Linha: " + n.getLine_number());
                      return null;
                    }
                  }
                  return sym.getArg();
                } else
                  error.add("Lista de parâmetros incompativeis-----! Linha: " + n.getLine_number());
              }
            }
          }
        }
        error.add("Mehtodo nao existe! Linha: " + n.getLine_number());
      } else error.add("Classe nao existe! Linha: " + n.getLine_number());
    }

    return null;
  }