public static void asignarC3D(ParseTreeNode asignacion)
        {
            /* Tree
             * ASIGNACION.Rule = ACCESO + asignar + EXP;
             * OLC++
             * ASIGNACION.Rule = self + punto + ACCESO + asignar + EXP
             | ACCESO + asignar + EXP;
             */
            int indice = 0;

            Acceso.Tipo tipo = Acceso.Tipo.NINGUNO;
            if (asignacion.ChildNodes[0].Term.Name.Equals("self") || asignacion.ChildNodes[0].Term.Name.Equals("este"))
            {
                tipo = Acceso.Tipo.ESTE;
                indice++;
            }
            else if (asignacion.ChildNodes[0].Term.Name.Equals("super"))
            {
                tipo       = Acceso.Tipo.SUPER;
                asignacion = asignacion.ChildNodes[1];
            }
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de la asignacion"));
            Nodo exp = Expresion.expresionC3D(asignacion.ChildNodes[indice + 1]);

            if (exp != null)
            {
                if (asignacion.ChildNodes[indice].Term.Name.Equals("ACCESO"))
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Empezar a Realizar el acceso"));
                    Acceso.generarC3DAcceso(asignacion.ChildNodes[indice], tipo, exp);
                }
            }
        }
Exemple #2
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 void recorrerDimensiones(ParseTreeNode arreglo, String pos)
 {
     if (arreglo.Term.Name.Equals("ARREGLO"))
     {
         foreach (ParseTreeNode arr in arreglo.ChildNodes)
         {
             recorrerDimensiones(arr, pos);
         }
     }
     else
     {
         Nodo exp = Expresion.expresionC3D(arreglo);
         if (exp != null)
         {
             GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                    "// Guardar expresion en el arreglo"));
             GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                    "Heap", pos, exp.cadena));
             GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                    "// Incrementar " + pos));
             GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                    pos, pos, "+", "1"));
         }
     }
 }
Exemple #4
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 void declararAsignarC3D(ParseTreeNode declaracion)
 {
     /* OLC++
      * DECLARACION.Rule = TIPO + LISTA_IDS + asignarR *---*
      | TIPO + LISTA_IDS + DARREGLO -> INDICES (ARREGLO)? *---*
      | TIPO + LISTA_IDS;
      * Tree
      * DECLARACION.Rule = TIPO + LISTA_IDS + asignarR *---*
      | TIPO + LISTA_IDS
      | TIPO + NARREGLO;
      */
     if (declaracion.ChildNodes.Count == 3)
     {
         int           tipo = Simbolo.getTipo(declaracion.ChildNodes[0].Token.Text);
         ParseTreeNode ids  = declaracion.ChildNodes[1];
         foreach (ParseTreeNode id in ids.ChildNodes)
         {
             if (declaracion.ChildNodes[2].Term.Name.Equals("DARREGLO"))
             {
                 ParseTreeNode darr = declaracion.ChildNodes[2];
                 // Guardar espacio
                 if (darr.ChildNodes.Count == 2)
                 {
                     // DARREGLO -> INDICES ARREGLO
                     Arreglo.guardarC3D(id.Token.Text, darr.ChildNodes[1], Acceso.Tipo.NINGUNO);
                 }
                 else
                 {
                     Arreglo.guardarC3D(id.Token.Text, null, Acceso.Tipo.NINGUNO);
                 }
             }
             else
             {
                 // EXP
                 Acceso.actual = null;
                 Nodo exp  = Expresion.expresionC3D(declaracion.ChildNodes[2]);
                 Nodo nodo = Acceso.generarC3DID(id.Token.Text, Acceso.Tipo.NINGUNO,
                                                 "P", "Stack");
                 // Asignar la expresion
                 GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                        nodo.estructura, nodo.referencia, exp.cadena));
             }
         }
     }
     else
     {
         // 2 hijos
         if (declaracion.ChildNodes[1].Term.Name.Equals("NARREGLO"))
         {
             ParseTreeNode id = declaracion.ChildNodes[1].ChildNodes[0];
             Arreglo.guardarC3D(id.Token.Text, null, Acceso.Tipo.NINGUNO);
         }
     }
 }
        public static Nodo generarMenorIgualC3D(ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nizq = Expresion.expresionC3D(izq);
            Nodo nder = Expresion.expresionC3D(der);

            if (nizq == null || nder == null)
            {
                return(null);
            }
            return(generarRelacional("<=", "menor o iguales", nizq, nder, izq, der));
        }
        public static Nodo generarMayorC3D(ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nizq = Expresion.expresionC3D(izq);
            Nodo nder = Expresion.expresionC3D(der);

            if (nizq == null || nder == null)
            {
                return(null);
            }
            return(generarRelacional(">", "mayor", nizq, nder, izq, der));
        }
        public static Nodo generarNoIgualC3D(ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nizq = Expresion.expresionC3D(izq);
            Nodo nder = Expresion.expresionC3D(der);

            if (nizq == null || nder == null)
            {
                return(null);
            }
            return(generarRelacional("!=", "diferentes", nizq, nder, izq, der));
        }
Exemple #9
0
        public static void evaluarCasoC3D(ParseTreeNode exp, Nodo pivote, String eCaso)
        {
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Evaluar expresion del caso"));
            Nodo ncaso = Expresion.expresionC3D(exp);

            if (ncaso != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Evaluar condicion del caso"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                       eCaso, ncaso.cadena, "==", pivote.cadena));
            }
        }
Exemple #10
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);
        }
Exemple #12
0
        private static String getExpresiones(ParseTreeNode expresiones, ref List <Nodo> exps)
        {
            String cadena = "";

            foreach (ParseTreeNode nexp in expresiones.ChildNodes)
            {
                Nodo exp = Expresion.expresionC3D(nexp);
                if (exp == null)
                {
                    return(null);
                }
                exps.Add(exp);
                cadena += "_" + Simbolo.getValor(exp.tipo);
            }
            return(cadena);
        }
        public static Nodo negacionC3D(ParseTreeNode exp)
        {
            Nodo cond = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp),
                                             exp.Span.Location.Line, exp.Span.Location.Column);

            if (cond != null)
            {
                if (cond.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    String eTemp = cond.etqVerdadera;
                    cond.etqVerdadera = cond.etqFalsa;
                    cond.etqFalsa     = eTemp;
                }
            }
            return(cond);
        }
        public static Nodo generarCrecimientoC3D(ParseTreeNode crecer)
        {
            // Es incremento o decremento y tiene que ser de tipo entero
            // CRECER -> EXP (++ | --)
            Nodo nodo = Expresion.expresionC3D(crecer.ChildNodes[0]);

            if (nodo == null)
            {
                return(null);
            }
            ParseTreeNode varC = crecer.ChildNodes[1];
            String        ope;

            if (varC.Term.Name.Equals("++"))
            {
                ope = "+";
            }
            else
            {
                ope = "-";
            }
            if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL ||
                nodo.tipo == (int)Simbolo.Tipo.CARACTER)
            {
                String temp = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// expresion " + ope + " expresion"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nodo.cadena, ope, "1"));
                if (!nodo.referencia.Equals(""))
                {
                    // Guardar en la variable
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "//guardar valor en id"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, nodo.estructura, nodo.referencia, temp));
                }
                nodo.cadena = temp;
                nodo.tipo   = (int)Simbolo.Tipo.DECIMAL;
            }
            else
            {
                Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                      "No se puede incrementar o decrementar el tipo " + Simbolo.getValor(nodo.tipo) + ".",
                                                      crecer.Token.Location.Line, crecer.Token.Location.Column));
            }
            return(nodo);
        }
        internal static Nodo unarioC3D(ParseTreeNode n2)
        {
            Nodo nodo = Expresion.expresionC3D(n2);

            if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL)
            {
                String temp = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar -1 * " + Simbolo.getValor(nodo.tipo)));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "-1", "*", nodo.cadena));
                nodo.cadena = temp;
            }
            else
            {
                Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                      "No se puede cambiar signo a " + Simbolo.getValor(nodo.tipo) + ".",
                                                      n2.Span.Location.Line, n2.Span.Location.Column));
            }
            return(nodo);
        }
        public static void evaluarSi(ParseTreeNode expresion, ParseTreeNode sentencias, String eSalida)
        {
            // Si (Expresion) { Sentencias }
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Inicio de la sentencia Si"));
            Nodo nsi = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                            Expresion.expresionC3D(expresion), expresion.Span.Location.Line,
                                            expresion.Span.Location.Column);

            if (nsi != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion verdadera"));
                GeneradorC3D.generarEtiquetas((nsi.etqVerdadera));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sentencias de Si"));
                C3DSentencias.generarC3D(sentencias);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// La condicion falsa"));
                GeneradorC3D.generarEtiquetas((nsi.etqFalsa));
            }
        }
        private static void generarC3DThis(Clase clase, String puntero, String estructura)
        {
            Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre);

            if (sclase != null)
            {
                String t1 = getTemporal();
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del this"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "0"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador donde incia el this"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para globales de " + clase.nombre));
                aumentarHeap(Convert.ToString(sclase.tam));
                // Recorrer las variables globales y asignarles
                foreach (Atributo atr in clase.atributos)
                {
                    if (atr.esArreglo)
                    {
                        Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.ESTE);
                    }
                    else
                    {
                        if (atr.valor != null)
                        {
                            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre));
                            Nodo exp = Expresion.expresionC3D(atr.valor);
                            Acceso.actual = null;
                            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre));
                            Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.ESTE, "P", "Stack");
                            if (nodo != null)
                            {
                                // Asignar la expresion
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Asignar expresion al atributo " + atr.nombre));
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                          nodo.estructura, nodo.referencia, exp.cadena));
                            }
                        }
                    }
                }
            }
        }
        public static String generarParametrizacionC3D(ParseTreeNode indices, Simbolo sid)
        {
            int    con  = 1;
            String temp = null;

            foreach (ParseTreeNode hijo in indices.ChildNodes)
            {
                Nodo exp = Expresion.expresionC3D(hijo);
                if (exp == null)
                {
                    break;
                }
                int    tam = sid.getTamanio(con);
                String t1  = GeneradorC3D.getTemporal();
                String t2  = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Restar uno a la posicion en la dimension " + con));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, exp.cadena,
                                                       "-", "1"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Multiplicarla por el tamanio de la dimension"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, t1, "*",
                                                       Convert.ToString(tam)));
                if (con > 1)
                {
                    String t3 = GeneradorC3D.getTemporal();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Sumar las dos posiciones"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, temp, "+", t2));
                    temp = t3;
                }
                else
                {
                    temp = t2;
                }
                con++;
            }
            return(temp);
        }
        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));
            }
        }
Exemple #20
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);
                }
            }
        }
        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;
                }
            }
        }
        private static void generarC3DSuper(Clase clase, String puntero, String estructura)
        {
            Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre);

            if (sclase != null)
            {
                String t1 = getTemporal();
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del super"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "1"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar posicion donde empieza super"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H"));
                // Buscar clase padre
                Clase padre;
                if (clase.padre != null)
                {
                    padre = getClasePadre(clase.padre);
                    if (padre == null)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
                sclase = TablaSimbolos.getInstance.getClase(clase.padre);
                if (sclase == null)
                {
                    return;
                }
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para la clase padre" + sclase.nombre));
                aumentarHeap(Convert.ToString(sclase.tam));
                // Recorrer las variables globales y asignarles
                foreach (Atributo atr in padre.atributos)
                {
                    if (atr.visibilidad == (int)Simbolo.Visibilidad.PUBLICO ||
                        atr.visibilidad == (int)Simbolo.Visibilidad.PROTEGIDO)
                    {
                        if (atr.esArreglo)
                        {
                            Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.SUPER);
                        }
                        else
                        {
                            if (atr.valor != null)
                            {
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre));
                                Nodo exp = Expresion.expresionC3D(atr.valor);
                                Acceso.actual = null;
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre));
                                Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.SUPER,
                                                                "P", "Stack");
                                if (nodo != null)
                                {
                                    // Asignar la expresion
                                    instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar valor del atributo " + atr.nombre));
                                    instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                              nodo.estructura, nodo.referencia, exp.cadena));
                                }
                            }
                        }
                    }
                }
            }
        }
        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);
        }
        public static Nodo generarMultiplicarC3D(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.NUMERO;
            switch (nizq.tipo)
            {
            case (int)Simbolo.Tipo.NUMERO:
                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 temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, num * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                break;

            case (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 temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, decimal * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    return(nodo);
                }
                break;

            case (int)Simbolo.Tipo.BOOLEAN:
                // bool - num
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, bool * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    return(Logica.generarC3D(izq, "&&", der));
                }
                break;

            case (int)Simbolo.Tipo.CARACTER:
                // bool - num
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Restar dos temporales, caracter * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                break;
            }
            //Error semantico!
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede multiplicar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }
        public static Nodo generarSumaC3D(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
            }
            switch (nizq.tipo)
            {
            case (int)Simbolo.Tipo.NUMERO:
                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 temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, num + num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nodo.cadena = GeneradorC3D.getTemporal();
                    nodo.tipo   = nder.tipo;
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , num + str"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para nueva cadena"));
                    concatenar(nizq.tipo, nizq.cadena);
                    concatenar(nder.tipo, nder.cadena);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0"));
                    GeneradorC3D.aumentarHeap("1");
                    return(nodo);
                }
                break;

            case (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 temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, decimal + num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nodo.cadena = GeneradorC3D.getTemporal();
                    nodo.tipo   = nder.tipo;
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , decimal + str"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0"));
                    concatenar(nizq.tipo, nizq.cadena);
                    concatenar(nder.tipo, nder.cadena);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0"));
                    GeneradorC3D.aumentarHeap("1");
                    return(nodo);
                }
                break;

            case (int)Simbolo.Tipo.CARACTER:
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar dos temporales, caracter + num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nder.tipo;
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nodo.cadena = GeneradorC3D.getTemporal();
                    nodo.tipo   = nder.tipo;
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , caracter + str"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0"));
                    concatenar(nizq.tipo, nizq.cadena);
                    concatenar(nder.tipo, nder.cadena);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0"));
                    GeneradorC3D.aumentarHeap("1");
                    return(nodo);
                }
                break;

            case (int)Simbolo.Tipo.BOOLEAN:
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO || nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    if (nder.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + num"));
                    }
                    else
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Sumar , bool + decimal"));
                    }
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "+", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nder.tipo;
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    return(Logica.generarC3D(izq, "||", der));
                }
                break;

            case (int)Simbolo.Tipo.CADENA:
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER)
                {
                    nodo.cadena = GeneradorC3D.getTemporal();
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + num"));
                    }
                    else if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + decimal"));
                    }
                    else
                    {
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + caracter"));
                    }
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0"));
                    concatenar(nizq.tipo, nizq.cadena);
                    concatenar(nder.tipo, nder.cadena);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0"));
                    GeneradorC3D.aumentarHeap("1");
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nodo.cadena = GeneradorC3D.getTemporal();
                    nodo.tipo   = nizq.tipo;
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Concatenar , str + str"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.cadena, "H", "+", "0"));
                    concatenar(nizq.tipo, nizq.cadena);
                    concatenar(nder.tipo, nder.cadena);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar fin de cadena"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", "0"));
                    GeneradorC3D.aumentarHeap("1");
                    return(nodo);
                }
                break;
            }
            // Error semantico!
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede sumar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }