private static void generarC3DClases()
 {
     // Recorrer cada una de las clases
     foreach (Clase clase in clases)
     {
         C3DSentencias.claseActual = clase;
         // Recorrer cada uno de los constructores
         foreach (Procedimiento constructor in clase.constructores)
         {
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            constructor.completo);
             //C3DSentencias.procedimientoActual = constructor.completo;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + constructor.completo));
             // Guardar H en t1
             String t1 = GeneradorC3D.getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador de la instancia"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0"));
             GeneradorC3D.aumentarHeap("2");
             // Generar this y super
             String t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "0"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t1));
             generarC3DThis(clase, t1, "Heap");
             t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "1"));
             String t5 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t5, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t5));
             generarC3DSuper(clase, t1, "Heap");
             String t3 = getTemporal();
             String t4 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t4, "P", "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t4, t3));
             // Sentencias del constructor
             C3DSentencias.generarC3D(constructor.sentencias);
             // Guardar en retorno la posicion del objeto creado
             String temp = C3DSentencias.retornarC3D(constructor.linea, constructor.columna);
             if (!temp.Equals(""))
             {
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                           "// Guardar el retorno en la posicion"));
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp,
                                           t1));
             }
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
         // Recorrer cada uno de los procedimientos
         foreach (Procedimiento procedimiento in clase.procedimientos)
         {
             C3DSentencias.eFinProcedimiento = getEtiqueta();
             //C3DSentencias.procedimientoActual = procedimiento.completo;
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            procedimiento.completo);
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + procedimiento.completo));
             // Sentencias del procedimiento
             C3DSentencias.generarC3D(procedimiento.sentencias);
             generarEtiquetas(C3DSentencias.eFinProcedimiento);
             C3DSentencias.eFinProcedimiento = null;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
     }
 }
        public static void generarC3D(ParseTreeNode sentencias)
        {
            foreach (ParseTreeNode sentencia in sentencias.ChildNodes)
            {
                switch (sentencia.Term.Name)
                {
                case "DECLARACION":
                    if (sentencia.ChildNodes.Count == 3)
                    {
                        declararAsignarC3D(sentencia);
                    }
                    break;

                case "ASIGNACION":
                    asignarC3D(sentencia);
                    break;

                case "SUPER":
                    if (sentencia.ChildNodes[1].Term.Name.Equals("ASIGNACION"))
                    {
                        asignarC3D(sentencia);
                    }
                    else if (sentencia.ChildNodes[1].Term.Name.Equals("ACCESO"))
                    {
                        // super + ACCESO
                        Acceso.generarC3DAcceso(sentencia.ChildNodes[1], Acceso.Tipo.SUPER, null);
                    }
                    else
                    {
                        // super + [ + EXPS + ]
                    }
                    break;

                case "ACCESO":
                    Acceso.generarC3DAcceso(sentencia, Acceso.Tipo.NINGUNO, null);
                    break;

                case "RETORNO":
                    if (procedimientoActual != null)
                    {
                        if (procedimientoActual.rol == (int)Simbolo.Tipo.FUNCION)
                        {
                            // Evaluar expresion
                            Nodo expRetorno = Expresion.expresionC3D(sentencia.ChildNodes[0]);
                            if (expRetorno != null)
                            {
                                // Guardar en retorno la posicion del objeto creado
                                String temp = C3DSentencias.retornarC3D(sentencia.Span.Location.Line, sentencia.Span.Location.Column);
                                if (!temp.Equals(""))
                                {
                                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                                           "// Guardar el retorno en la posicion"));
                                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp,
                                                                           expRetorno.cadena));
                                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                                           "// Salto al final de la funcion " + procedimientoActual.nombre));
                                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eFinProcedimiento));
                                }
                            }
                        }
                        else
                        {
                            if (procedimientoActual.rol == (int)Simbolo.Tipo.METODO)
                            {
                                Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                      "Retornar vino dentro de un metodo!", sentencia.Span.Location.Line,
                                                                      sentencia.Span.Location.Column));
                            }
                            else
                            {
                                Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                      "Retornar vino dentro de un constructor!", sentencia.Span.Location.Line,
                                                                      sentencia.Span.Location.Column));
                            }
                        }
                    }
                    break;

                case "IMPRIMIR":
                    Nodo exp = Expresion.expresionC3D(sentencia.ChildNodes[1]);
                    // Recorrer e imprimir segun el caso
                    if (exp != null)
                    {
                        Imprimir.imprimirC3D(exp);
                    }
                    break;

                case "NATIVAS":
                    Nodo expN = Expresion.expresionC3D(sentencia.ChildNodes[1]);
                    if (expN != null)
                    {
                        Convertidor.generarC3D(sentencia.ChildNodes[0].Token.Text, expN);
                    }
                    break;

                case "CONTINUAR":
                    // continue;
                    String eInicio = GeneradorC3D.display.buscarInicio();
                    if (eInicio == null)
                    {
                        Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                              "Continuar vino fuera de un ciclo.", sentencia.Span.Location.Line,
                                                              sentencia.Span.Location.Column));
                    }
                    else
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Continue"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                    }
                    break;

                case "INTERRUMPIR":
                    // break;
                    String eSalidaI = GeneradorC3D.display.buscarSalida();
                    if (eSalidaI == null)
                    {
                        Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                              "Interrumpir vino fuera de un ciclo.", sentencia.Span.Location.Line,
                                                              sentencia.Span.Location.Column));
                    }
                    else
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Break"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalidaI));
                    }
                    break;

                case "IF1":
                    // IF1 -> EXP Sentencias
                    String eSalida = GeneradorC3D.getEtiqueta();
                    Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida);
                    GeneradorC3D.generarEtiquetas(eSalida);
                    break;

                case "IF2":
                    // IF2 -> EXP Sentencias Sentencias
                    String eSalida2 = GeneradorC3D.getEtiqueta();
                    Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida2);
                    Si.evaluarSino(sentencia.ChildNodes[2], eSalida2);
                    GeneradorC3D.generarEtiquetas(eSalida2);
                    break;

                case "IF3":
                    // IF3 -> EXP Sentencias IF4

                    /*
                     * IF4.Rule = IF4 EXP Sentencias
                     | EXP Sentencias;
                     * */
                    String eSalida3 = GeneradorC3D.getEtiqueta();
                    Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida3);
                    Si.evaluarIF4(sentencia.ChildNodes[2], eSalida3);
                    GeneradorC3D.generarEtiquetas(eSalida3);
                    break;

                case "IF5":
                    // IF5 -> EXP Sentencias IF4 Sentencias
                    String eSalida4 = GeneradorC3D.getEtiqueta();
                    Si.evaluarSi(sentencia.ChildNodes[0], sentencia.ChildNodes[1], eSalida4);
                    Si.evaluarIF4(sentencia.ChildNodes[2], eSalida4);
                    Si.evaluarSino(sentencia.ChildNodes[3], eSalida4);
                    GeneradorC3D.generarEtiquetas(eSalida4);
                    break;

                case "FOR":
                    // FOR.Rule = Fasignar (D o A) EXP EXP Sentencias
                    // Declarar o asignar!
                    Para.evaluarParaC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1],
                                        sentencia.ChildNodes[2], sentencia.ChildNodes[3]);
                    break;

                case "WHILE":
                    //WHILE -> EXP Sentencias
                    Mientras.evaluarMientrasC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]);
                    break;

                case "X":
                    X.evaluarXC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1], sentencia.ChildNodes[2]);
                    break;

                case "REPEAT":
                    Repetir.evaluarRepetirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]);
                    break;

                case "DO_WHILE":
                    Hacer.evaluarHacerC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]);
                    break;

                case "SWITCH":
                    Elegir.evaluarElegirC3D(sentencia.ChildNodes[0], sentencia.ChildNodes[1]);
                    break;

                case "LOOP":
                    Loop.evaluarLoopC3D(sentencia.ChildNodes[0].ChildNodes[0]);
                    break;
                }
            }
        }