public static void evaluarLoopC3D(ParseTreeNode sentencias)
        {
            //LOOP -> Sentencias
            String eInicio = GeneradorC3D.getEtiqueta();
            String eSal    = GeneradorC3D.getEtiqueta();

            GeneradorC3D.generarEtiquetas((eInicio));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de loop"));

            GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.LOOP, "", eInicio, eSal);
            // Sentencias de Loop
            C3DSentencias.generarC3D(sentencias);
            Ciclo loop = GeneradorC3D.display.getCiclo();

            if (loop.interrupciones == 0)
            {
                Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                      "El loop no contiene sentencia de escape!", sentencias.Span.Location.Line,
                                                      sentencias.Span.Location.Column));
            }
            GeneradorC3D.display.removerCiclo();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
            GeneradorC3D.generarEtiquetas((eSal));
        }
Esempio n. 2
0
        public static void evaluarRepetirC3D(ParseTreeNode sentencias, ParseTreeNode cond)
        {
            //REPEAT -> Sentencias EXP
            String eAux    = GeneradorC3D.getEtiqueta();
            String eInicio = GeneradorC3D.getEtiqueta();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eAux));
            GeneradorC3D.generarEtiquetas((eInicio));
            Nodo nhacer = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                               Expresion.expresionC3D(cond), cond.Span.Location.Line,
                                               cond.Span.Location.Column);

            if (nhacer != null)
            {
                GeneradorC3D.generarEtiquetas((eAux));
                GeneradorC3D.generarEtiquetas((nhacer.etqFalsa));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de repeat-until"));

                GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.REPEAT, "", eInicio, nhacer.etqFalsa);
                // Sentencias de Repeat
                C3DSentencias.generarC3D(sentencias);
                GeneradorC3D.display.removerCiclo();

                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                GeneradorC3D.generarEtiquetas((nhacer.etqVerdadera));
            }
        }
        public static Nodo sumarCaracteres(String tcadena)
        {
            Nodo nodo = new Nodo();

            // temporales y etiquetas
            nodo.tipo   = (int)Simbolo.Tipo.NUMERO;
            nodo.cadena = GeneradorC3D.getTemporal();
            String t2      = GeneradorC3D.getTemporal();
            String eInicio = GeneradorC3D.getEtiqueta();
            String eFin    = GeneradorC3D.getEtiqueta();

            // Codigo 3D
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Variable de control de suma de caracteres"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "0", "", ""));
            GeneradorC3D.generarEtiquetas(eInicio);
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Acceder a la posicion de la cadena en " + tcadena));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", t2, tcadena));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Diferente de fin de cadena"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eFin, t2, "==", "0"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar el caracter con la var de control"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, nodo.cadena, "+", t2));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Incrementar " + tcadena));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tcadena, tcadena, "+", "1"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
            GeneradorC3D.generarEtiquetas(eFin);

            return(nodo);
        }
Esempio n. 4
0
        public static void evaluarParaC3D(ParseTreeNode tipo, ParseTreeNode cond,
                                          ParseTreeNode control, ParseTreeNode sentencias)
        {
            //FOR -> DECLARACION/ASIGNACION EXP ASIGNACION Sentencias
            C3DSentencias.generarC3D(tipo);
            String eInicio = GeneradorC3D.getEtiqueta();
            String eAux    = GeneradorC3D.getEtiqueta();

            GeneradorC3D.generarEtiquetas((eInicio));
            Nodo npara = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                              Expresion.expresionC3D(cond), cond.Span.Location.Line,
                                              cond.Span.Location.Column);

            if (npara != null)
            {
                GeneradorC3D.generarEtiquetas((npara.etqVerdadera));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de for"));
                GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.FOR, "", eAux, npara.etqFalsa);
                // Sentencias de Para
                C3DSentencias.generarC3D(sentencias);
                GeneradorC3D.display.removerCiclo();
                GeneradorC3D.generarEtiquetas(eAux);
                Expresion.expresionC3D(control);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                GeneradorC3D.generarEtiquetas((npara.etqFalsa));
            }
        }
        public static Nodo generarRelacional(String ope, String texto, Nodo nizq, Nodo nder, ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();

            nodo.tipo         = (int)Simbolo.Tipo.BOOLEAN;
            nodo.etqVerdadera = GeneradorC3D.getEtiqueta();
            nodo.etqFalsa     = GeneradorC3D.getEtiqueta();
            if (nizq.tipo == (int)Simbolo.Tipo.NUMERO ||
                nizq.tipo == (int)Simbolo.Tipo.DECIMAL)
            {
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            else if (nizq.tipo == (int)Simbolo.Tipo.CARACTER)
            {
                if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nder = sumarCaracteres(nder.cadena);
                }
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER ||
                    nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            else if (nizq.tipo == (int)Simbolo.Tipo.CADENA)
            {
                nizq = sumarCaracteres(nizq.cadena);
                if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nder = sumarCaracteres(nder.cadena);
                }
                if (nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede comparar si son " + texto + " el tipo " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }
Esempio n. 6
0
        /*
         * SWITCH.Rule = selector + caso + EXP + dosp + Eos + BCASO;
         *
         *  BCASO.Rule = Indent + CASOS + DEFECTO + Dedent
         | Indent + CASOS + Dedent;
         |
         |  CASOS.Rule = MakeStarRule(CASOS, CASO);
         |
         |  CASO.Rule = EXP + dosp + Eos + BLOQUE;
         |
         |  DEFECTO.Rule = defecto + dosp + Eos + BLOQUE;
         */
        public static void evaluarElegirC3D(ParseTreeNode expresion, ParseTreeNode bcaso)
        {
            //SWITCH -> EXP BCASO
            List <string> etiquetasCaso = new List <string>();
            String        eTest         = GeneradorC3D.getEtiqueta();
            String        eSal          = GeneradorC3D.getEtiqueta();

            //Recorrer EXP
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ETIQUETA, eTest));
            Nodo nexp = Expresion.expresionC3D(expresion);

            if (nexp != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eTest));
                //Recorrer cada caso
                foreach (ParseTreeNode caso in bcaso.ChildNodes[0].ChildNodes)
                {
                    //Caso -> ECASO Sentencias
                    String eCaso = GeneradorC3D.getEtiqueta();
                    etiquetasCaso.Add(eCaso);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Inicio de caso "));
                    GeneradorC3D.generarEtiquetas((eCaso));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de caso "));

                    GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.SWITCH, "", "", eSal);
                    // Sentencias de Switch
                    C3DSentencias.generarC3D(caso.ChildNodes[1].ChildNodes[0]);
                    GeneradorC3D.display.removerCiclo();
                }
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSal));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ETIQUETA, eTest));
                int contar = 0;
                foreach (ParseTreeNode caso in bcaso.ChildNodes[0].ChildNodes)
                {
                    evaluarCasoC3D(caso.ChildNodes[0], nexp, etiquetasCaso[contar]);
                    contar++;
                }
                //Defecto?
                if (bcaso.ChildNodes.Count == 2)
                {
                    //Sentencias de Defecto
                    GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.SWITCH, "", "", eSal);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de defecto"));
                    GeneradorC3D.display.removerCiclo();
                    C3DSentencias.generarC3D(bcaso.ChildNodes[0].ChildNodes[0]);
                }
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Etiqueta de salida del switch"));
                GeneradorC3D.generarEtiquetas((eSal));
            }
        }
        public static Nodo generarDividirC3D(ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();
            Nodo nizq = Expresion.expresionC3D(izq);
            Nodo nder = Expresion.expresionC3D(der);

            if (nizq == null || nder == null)
            {
                return(null);
            }
            if (nizq.tipo == (int)Simbolo.Tipo.VACIO)
            {
                //Error: NullPointerException
            }
            if (nder.tipo == (int)Simbolo.Tipo.VACIO)
            {
                //Error: NullPointerException
            }
            nodo.cadena = GeneradorC3D.getTemporal();
            nodo.tipo   = (int)Simbolo.Tipo.DECIMAL;
            if (nizq.tipo == (int)Simbolo.Tipo.NUMERO ||
                nizq.tipo == (int)Simbolo.Tipo.CARACTER ||
                nizq.tipo == (int)Simbolo.Tipo.BOOLEAN ||
                nizq.tipo == (int)Simbolo.Tipo.DECIMAL)
            {
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER ||
                    nder.tipo == (int)Simbolo.Tipo.BOOLEAN ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String eError  = GeneradorC3D.getEtiqueta();
                    String eSalida = GeneradorC3D.getEtiqueta();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Dividir num / num"));
                    // Verificar si num en nder no es 0
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, nder.cadena, "==", "0"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, nizq.cadena, "/", nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida));
                    GeneradorC3D.generarEtiquetas((eError));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Error: No se puede dividir entre 0"));
                    GeneradorC3D.generarEtiquetas((eSalida));
                    return(nodo);
                }
            }
            //Error semantico!
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede dividir " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }
        public static void concatenar(int tipo, String cadena)
        {
            switch (tipo)
            {
            case (int)Simbolo.Tipo.NUMERO:
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "-241094.22"));
                GeneradorC3D.aumentarHeap("1");
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar numero"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena));
                GeneradorC3D.aumentarHeap("1");
                break;

            case (int)Simbolo.Tipo.DECIMAL:
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "-241094.22"));
                GeneradorC3D.aumentarHeap("1");
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar decimal"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena));
                GeneradorC3D.aumentarHeap("1");
                break;

            case (int)Simbolo.Tipo.CARACTER:
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar caracter"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", cadena));
                GeneradorC3D.aumentarHeap("1");
                break;

            case (int)Simbolo.Tipo.CADENA:
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//Guardar cadena de " + cadena));
                String taux    = GeneradorC3D.getTemporal();
                String eFin    = GeneradorC3D.getEtiqueta();
                String eInicio = GeneradorC3D.getEtiqueta();
                GeneradorC3D.generarEtiquetas((eInicio));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", taux, cadena));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//Si no es fin de cadena guarda el valor"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eFin, taux, "==", "0"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", taux));
                GeneradorC3D.aumentarHeap("1");
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar el contador que lleva la posicion del Heap"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, cadena, cadena, "+", "1"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                GeneradorC3D.generarEtiquetas((eFin));
                break;
            }
        }
        public static void evaluarMientrasC3D(ParseTreeNode exp, ParseTreeNode sentencias)
        {
            String eInicio = GeneradorC3D.getEtiqueta();

            GeneradorC3D.generarEtiquetas((eInicio));
            Nodo nmientras = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                                  Expresion.expresionC3D(exp), exp.Span.Location.Line,
                                                  exp.Span.Location.Column);

            if (nmientras != null)
            {
                GeneradorC3D.generarEtiquetas((nmientras.etqVerdadera));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de while"));

                GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILE, "", eInicio, nmientras.etqFalsa);
                //Sentencias de while
                C3DSentencias.generarC3D(sentencias);
                GeneradorC3D.display.removerCiclo();

                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                GeneradorC3D.generarEtiquetas((nmientras.etqFalsa));
            }
        }
Esempio n. 10
0
        public static void evaluarXC3D(ParseTreeNode exp1, ParseTreeNode exp2,
                                       ParseTreeNode sentencias)
        {
            //WHILEX -> EXP EXP Sentencias
            String eInicio = GeneradorC3D.getEtiqueta();
            String eSen    = GeneradorC3D.getEtiqueta();
            String eCond   = GeneradorC3D.getEtiqueta();
            String eSalida = GeneradorC3D.getEtiqueta();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Inicializar temporal auxiliar"));
            String taux = GeneradorC3D.getTemporal();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                   taux, "0", "", ""));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Etiqueta de Inicio del ciclo X"));
            GeneradorC3D.generarEtiquetas((eInicio));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Evaluar condicion 1"));
            Nodo cond1 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                              Expresion.expresionC3D(exp1), exp1.Span.Location.Line, exp1.Span.Location.Column);

            if (cond1 != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Etiqueta verdadera primera condicion"));
                GeneradorC3D.generarEtiquetas(cond1.etqVerdadera);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Evaluar condicion por primera vez"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                       eSen, taux, "==", "0"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                       eCond));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Etiqueta falsa primera condicion"));
                GeneradorC3D.generarEtiquetas(cond1.etqFalsa);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                       eSalida, taux, "==", "1"));
                GeneradorC3D.generarEtiquetas(eCond);
                Nodo cond2 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                                  Expresion.expresionC3D(exp2), exp2.Span.Location.Line, exp2.Span.Location.Column);
                if (cond2 != null)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Etiqueta verdadera segunda condicion"));
                    GeneradorC3D.generarEtiquetas(cond2.etqVerdadera);
                    GeneradorC3D.generarEtiquetas(eSen);
                    GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILEX, "", eInicio, eSalida);
                    // Sentencias de X
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Sentencia del ciclo X"));
                    C3DSentencias.generarC3D(sentencias);
                    GeneradorC3D.display.removerCiclo();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                           taux, "1", "", ""));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Salta al inicio"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                           eInicio));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Etiqueta falsa segunda condicion y salida"));
                    GeneradorC3D.generarEtiquetas(cond2.etqFalsa);
                    GeneradorC3D.generarEtiquetas(eSalida);
                }
            }
        }
Esempio n. 11
0
 public static void imprimirC3D(Nodo texp)
 {
     if (texp.tipo == (int)Simbolo.Tipo.NUMERO)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%d", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.DECIMAL)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%f", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.CARACTER)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.CADENA)
     {
         // Ciclo para recorrer la cadena
         String eInicio = GeneradorC3D.getEtiqueta();
         String eAux    = GeneradorC3D.getEtiqueta();
         String eFin    = GeneradorC3D.getEtiqueta();
         String t2      = GeneradorC3D.getTemporal();
         GeneradorC3D.generarEtiquetas(eInicio);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                "Heap", t2, texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                eFin, t2, "==", "0"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                eAux, t2, "!=", "-241094.22"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                "Heap", t2, texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%f", t2));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                eInicio));
         GeneradorC3D.generarEtiquetas(eAux);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", t2));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                eInicio));
         GeneradorC3D.generarEtiquetas(eFin);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else
     {
         // Error semantico!
     }
 }
        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;
                }
            }
        }
Esempio n. 13
0
        /* //ARREGLOS!
         * public Nodo guardarArregloC3D(Simbolo arr, ParseTreeNode indices, String eError)
         * {
         *   // INDICES -> INDICES INDICE
         *   //          | INDICE
         *   Nodo nuevo = new Nodo();
         *   if (indices.ChildNodes.Count == 2)
         *   {
         *       Nodo indiceE = guardarArregloC3D(arr, indices.ChildNodes.ElementAt(0), eError);
         *       Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(1), eError, indiceE.externa);
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// " + indiceE.externa.ToString() + " dimension externa!"));
         *       String tam = tablaSimbolos.getTamanio(arr, indiceE.externa, dimInterna.interna).ToString();
         *       String temp1 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, dimInterna.cadena, "*", tam));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indiceE.cadena, "+", temp1));
         *       nuevo.externa = indiceE.externa + 1;
         *   }
         *   else
         *   {
         *       Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(0), eError, 1);
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// 1 dimension externa!"));
         *       nuevo.cadena = getTemporal();
         *       String tam = tablaSimbolos.getTamanio(arr, 1, dimInterna.interna).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, dimInterna.cadena, "*", tam));
         *       nuevo.externa = 2;
         *   }
         *   return nuevo;
         * }
         *
         * public Nodo getInternasC3D(Simbolo arr, ParseTreeNode indice, String eError, int externa)
         * {
         *   // INDICE -> INDICE EXP
         *   //         | EXP
         *   Nodo nuevo = new Nodo();
         *   if (indice.ChildNodes.Count == 2)
         *   {
         *       Nodo indice1 = getInternasC3D(arr, indice.ChildNodes.ElementAt(0), eError, externa);
         *       Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(1));
         *       String inf = tablaSimbolos.getIndiceInferior(arr, externa, indice1.interna).ToString();
         *       String sup = tablaSimbolos.getIndiceSuperior(arr, externa, indice1.interna).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede"));
         *       String temp1 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, exp.cadena, "-", inf));
         *       String tam = tablaSimbolos.getTamanio(arr, externa, indice1.interna).ToString();
         *       String temp2 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp2, temp1, "*", tam));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indice1.cadena, "+", temp2));
         *       nuevo.interna = indice1.interna + 1;
         *   }
         *   else
         *   {
         *       //ext -> 1, int -> 1
         *       Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(0));
         *       String inf = tablaSimbolos.getIndiceInferior(arr, externa, 1).ToString();
         *       String sup = tablaSimbolos.getIndiceSuperior(arr, externa, 1).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede"));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, exp.cadena, "-", inf));
         *       nuevo.interna = 2;
         *   }
         *   return nuevo;
         * }
         *
         * //ID!
         * public Nodo getIDC3D(ParseTreeNode nodo)
         * {
         *   Nodo nuevo = new Nodo();
         *   nuevo.pila = "Stack";
         *   Simbolo objeto = tablaSimbolos.buscarVariable(nodo.ChildNodes.ElementAt(0).
         *                           Token.Value.ToString(), nombreMetodo);
         *   if (objeto == null)
         *   {
         *       objeto = tablaSimbolos.buscarGlobal(nodo.ChildNodes.ElementAt(0).Token.Value.ToString());
         *       if (objeto == null)
         *       {
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *               " no ha sido declarada!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *           return null;
         *       }
         *   }
         *   nuevo.tipo = objeto.tipo;
         *
         *   String eError = getEtiqueta();
         *   String eSalida = getEtiqueta();
         *   ParseTreeNode acceso = nodo.ChildNodes.ElementAt(1);
         *   // Generacion de codigo de referencia y valor...
         *   String temp1 = getTemporal();
         *   nuevo.posicion = temp1;
         *   if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL)
         *   {
         *       nuevo.referencia = "error";
         *   }
         *   else
         *   {
         *       if (objeto.dimensiones != null)
         *       {
         *           //ES ARREGLO!
         *       }
         *       else
         *       {
         *           if (objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *           {
         *               nuevo.referencia = temp1;
         *           }
         *           else
         *           {
         *               nuevo.referencia = "error";
         *           }
         *       }
         *   }
         *   String val = "P";
         *   if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL)
         *   {
         *       val = "0";
         *   }
         *   instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar posicion en pila o heap (global) de " + objeto.nombre));
         *   C3D ins1 = new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, val, "+", objeto.pos.ToString());
         *   instrucciones.Add(ins1);
         *   Simbolo ter1 = new Simbolo();
         *   ter1.tipo = (int)Simbolo.Tipo.ETIQUETA;
         *   ter1.nombre = temp1;
         *   ter1.padre = nombreMetodo;
         *   ter1.instruccion = ins1;
         *   nuevo.cadena = getTemporal();
         *   instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar valor de " + objeto.nombre));
         *   C3D ins2 = new C3D((int)C3D.TipoC3D.ACCESO, nuevo.pila, nuevo.cadena, temp1);
         *   instrucciones.Add(ins2);
         *   Simbolo ter2 = new Simbolo();
         *   ter2.tipo = (int)Simbolo.Tipo.ETIQUETA;
         *   ter2.nombre = nuevo.cadena;
         *   ter2.padre = nombreMetodo;
         *   ter2.instruccion = ins2;
         *   if (enRetorno && !esParametro)
         *   {
         *       tablaSimbolos.Add(ter1);
         *       tablaSimbolos.Add(ter2);
         *   }
         *   if (acceso.ChildNodes.Count > 0)
         *   {
         *       // SE HACE EL ACCESO!
         *       if (objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *       {
         *           nuevo.padre = objeto.estructura;
         *           nuevo = getAccesoC3D(nuevo, acceso, eError);
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto a salida"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida));
         *           generarEtiquetas((eError));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// NullPointerException"));
         *           String taux = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "102"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, "0"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           generarEtiquetas((eSalida));
         *       }
         *       else
         *       {
         *           //Error!
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "El objeto " + objeto.nombre + " no es una estructura, no se puede acceder!",
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *           return null;
         *       }
         *   }
         *   return nuevo;
         * }
         *
         * //ACCESO!
         * public Nodo getAccesoC3D(Nodo objeto, ParseTreeNode accesos, String eError)
         * {
         *   // ID (ACCESO -> .ID.ID.ID...)
         *   // En objeto trae el valor en cadena y en padre trae el nombre del objeto a accesar
         *
         *   foreach (ParseTreeNode acceso in accesos.ChildNodes)
         *   {
         *       int tipo = objeto.tipo;
         *       String padre = objeto.padre;
         *       if (tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *       {
         *           Simbolo atributo = tablaSimbolos.buscarAtributo(acceso.Token.Value.ToString(), padre);
         *           if (atributo == null)
         *           {
         *               Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                   "El atributo " + acceso.Token.Value.ToString() +
         *                   " no existe en " + objeto.padre + "!", acceso.Token.Location.Line,
         *                   acceso.Token.Location.Column));
         *               return null;
         *           }
         *           objeto.tipo = atributo.tipo;
         *           objeto.padre = atributo.estructura;
         *           // Realizar C3D
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Verificar que no sea NULL"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, objeto.cadena, "==", "-201314863.102494"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de " + atributo.nombre));
         *           objeto.referencia = getTemporal();
         *           objeto.posicion = objeto.referencia;
         *           objeto.pila = "Heap";
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, objeto.referencia, objeto.cadena, "+", atributo.pos.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de " + atributo.nombre));
         *           objeto.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", objeto.cadena, objeto.referencia));
         *           if (!(objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA))
         *           {
         *               objeto.referencia = "error";
         *           }
         *       }
         *       else
         *       {
         *           //Error! No se puede acceder algo que no sea una estructura!
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "El atributo " + padre + " no es una estructura, no se puede acceder!",
         *               acceso.Token.Location.Line,
         *               acceso.Token.Location.Column));
         *           return null;
         *       }
         *
         *   }
         *   return objeto;
         * }
         *
         * // NATIVAS
         * public Nodo generarC3DNativas(ParseTreeNode nodo)
         * {
         *   Nodo retorno = new Nodo();
         *   switch (nodo.ChildNodes.ElementAt(0).Term.Name)
         *   {
         *       case "inNum":
         *           Nodo expN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           Nodo expN2 = expresionC3D(nodo.ChildNodes.ElementAt(2));
         *           if (expN1 == null || expN2 == null)
         *           {
         *               return null;
         *           }
         *           String taux = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, expN1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, num"));
         *           String tpar2 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2, taux, "+", "2"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2, expN2.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tpos = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpos, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tpos));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getBool":
         *           Nodo expB1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           if (expB1 == null)
         *           {
         *               return null;
         *           }
         *           String tauxB = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxB, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1B = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1B, tauxB, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1B, expB1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.BOOLEAN;
         *           String tposB = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposB, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposB));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getNum":
         *           Nodo expgN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           Nodo expgN2 = expresionC3D(nodo.ChildNodes.ElementAt(2));
         *           Nodo expgN3 = expresionC3D(nodo.ChildNodes.ElementAt(3));
         *           if (expgN1 == null || expgN2 == null || expgN3 == null)
         *           {
         *               return null;
         *           }
         *           String tauxg = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxg, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1g, tauxg, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1g, expgN1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, referencia"));
         *           String tpar2g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2g, tauxg, "+", "2"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2g, expgN2.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del tercer parametro, num"));
         *           String tpar3g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar3g, tauxg, "+", "3"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar3g, expgN3.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tposg = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposg, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposg));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getLength":
         *           if (nodo.ChildNodes.Count == 2)
         *           {
         *               //getLength
         *               Nodo expLN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *               if (expLN1 == null)
         *               {
         *                   return null;
         *               }
         *               String tauxl = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxl, "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *               String tpar1l = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1l, tauxl, "+", "1"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1l, expLN1.cadena));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *               retorno.referencia = "error";
         *               retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *               String tposl = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposl, "P", "+", "0"));
         *               retorno.cadena = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposl));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *
         *           }
         *           else
         *           {
         *               //getLengthArreglo   -> id num
         *               String id = nodo.ChildNodes.ElementAt(1).Token.Value.ToString();
         *               Simbolo arreglo = tablaSimbolos.buscarVariable(id, nombreMetodo);
         *               if (arreglo == null)
         *               {
         *                   arreglo = tablaSimbolos.buscarGlobal(id);
         *                   if (arreglo == null)
         *                   {
         *                       Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                           "El arreglo " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *                           " no ha sido declarado!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *                           nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *                       return null;
         *                   }
         *               }
         *               if (arreglo.dims == -1)
         *               {
         *                   Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                       "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *                       " no es de tipo areglo!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *                       nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *                   return null;
         *               }
         *               int dimension = Convert.ToInt32(nodo.ChildNodes.ElementAt(2).Token.Value.ToString());
         *               int tam = tablaSimbolos.getTamanio(arreglo, dimension);
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *               retorno.referencia = "error";
         *               retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *               retorno.cadena = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, retorno.cadena, tam.ToString(), "", ""));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           }
         *           break;
         *       default:
         *           // getRandom
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tposr = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposr, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposr));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *   }
         *
         *   return retorno;
         * }
         */

        //CASTEO DE EXPRESIONES!
        public static Nodo castearC3D(int tipo, Nodo nodo, int f, int c)
        {
            if (nodo == null)
            {
                return(null);
            }
            if (nodo.tipo == (int)Simbolo.Tipo.BOOLEAN)
            {
                if (nodo.etqFalsa == null && nodo.etqVerdadera == null)
                {
                    nodo.tipo = (int)Simbolo.Tipo.NUMERO;
                }
            }
            if (nodo.tipo == tipo)
            {
                return(nodo);
            }
            else
            {
                Nodo nuevo = new Nodo();
                switch (tipo)
                {
                case (int)Simbolo.Tipo.NUMERO:
                    if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a entero", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a entero", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.CARACTER:
                    if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a caracter", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a caracter", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.DECIMAL:
                    if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a decimal", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a decimal", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.BOOLEAN:
                    // BOOLEAN
                    if (nodo.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        nuevo.tipo         = tipo;
                        nuevo.etqVerdadera = GeneradorC3D.getEtiqueta();
                        nuevo.etqFalsa     = GeneradorC3D.getEtiqueta();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Castear num a bool"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nuevo.etqFalsa, nodo.cadena, "==", "0"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nuevo.etqVerdadera));
                        return(nuevo);
                    }
                    else
                    {
                        Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                              "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a bool", f, c));
                        return(null);
                    }

                default:
                    // CADENA
                    Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                          "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a cadena", f, c));
                    return(null);
                }
            }
        }
        public static Nodo generarC3D(ParseTreeNode izq, String operador, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();

            nodo.cadena = GeneradorC3D.getEtiqueta();
            nodo.tipo   = (int)Simbolo.Tipo.BOOLEAN;
            GeneradorC3D.generarEtiquetas((nodo.cadena));
            if (operador.Equals("||"))
            {
                // OR
                Nodo nizq = Expresion.expresionC3D(izq);
                if (nizq == null)
                {
                    return(null);
                }
                if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    if (nizq.etqVerdadera == null && nizq.etqFalsa == null)
                    {
                        nizq.tipo = (int)Simbolo.Tipo.NUMERO;
                    }
                }
                nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column);
                if (nizq != null)
                {
                    GeneradorC3D.generarEtiquetas((nizq.etqFalsa));
                    Nodo nder = Expresion.expresionC3D(der);
                    if (nder == null)
                    {
                        return(null);
                    }
                    if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                    {
                        if (nder.etqVerdadera == null && nder.etqFalsa == null)
                        {
                            nder.tipo = (int)Simbolo.Tipo.NUMERO;
                        }
                    }
                    nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column);
                    if (nder != null)
                    {
                        nodo.etqVerdadera = nizq.etqVerdadera + "," + nder.etqVerdadera;
                        nodo.etqFalsa     = nder.etqFalsa;
                    }
                    else
                    {
                        //Ocurrio Error!
                        return(null);
                    }
                }
                else
                {
                    //Ocurrio Error!
                    return(null);
                }
            }
            else if (operador.Equals("&&"))
            {
                // AND
                Nodo nizq = Expresion.expresionC3D(izq);
                if (nizq == null)
                {
                    return(null);
                }
                if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    if (nizq.etqVerdadera == null && nizq.etqFalsa == null)
                    {
                        nizq.tipo = (int)Simbolo.Tipo.NUMERO;
                    }
                }
                nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column);
                if (nizq != null)
                {
                    GeneradorC3D.generarEtiquetas((nizq.etqVerdadera));
                    Nodo nder = Expresion.expresionC3D(der);
                    if (nder == null)
                    {
                        return(null);
                    }
                    if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                    {
                        if (nder.etqVerdadera == null && nder.etqFalsa == null)
                        {
                            nder.tipo = (int)Simbolo.Tipo.NUMERO;
                        }
                    }
                    nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column);
                    if (nder != null)
                    {
                        nodo.etqVerdadera = nder.etqVerdadera;
                        nodo.etqFalsa     = nizq.etqFalsa + "," + nder.etqFalsa;
                    }
                    else
                    {
                        //Ocurrio un error!
                        return(null);
                    }
                }
                else
                {
                    //Ocurrio un Error!
                    return(null);
                }
            }
            else
            {
                //|? XOR
                Nodo nizq = Expresion.expresionC3D(izq);
                if (nizq == null)
                {
                    return(null);
                }
                if (nizq.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    if (nizq.etqVerdadera == null && nizq.etqFalsa == null)
                    {
                        nizq.tipo = (int)Simbolo.Tipo.NUMERO;
                    }
                }
                nizq = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nizq, izq.Span.Location.Line, izq.Span.Location.Column);
                if (nizq != null)
                {
                    GeneradorC3D.generarEtiquetas((nizq.etqFalsa));
                    Nodo nder = Expresion.expresionC3D(der);
                    if (nder == null)
                    {
                        return(null);
                    }
                    if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                    {
                        if (nder.etqVerdadera == null && nder.etqFalsa == null)
                        {
                            nder.tipo = (int)Simbolo.Tipo.NUMERO;
                        }
                    }
                    nder = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, nder, der.Span.Location.Line, der.Span.Location.Column);
                    if (nder != null)
                    {
                        nodo.etqVerdadera = nder.etqFalsa;
                        nodo.etqFalsa     = nizq.etqVerdadera + "," + nder.etqVerdadera;
                    }
                    else
                    {
                        //Ocurrio un error!
                        return(null);
                    }
                }
                else
                {
                    //Ocurrio un error!
                    return(null);
                }
            }
            return(nodo);
        }