public static void guardarC3D(string id, ParseTreeNode arreglo, Acceso.Tipo tipo)
        {
            Acceso.actual = null;
            Nodo nodo = Acceso.generarC3DID(id, tipo, "P", "Stack");

            if (nodo == null)
            {
                return;
            }
            Simbolo sid;

            if (C3DSentencias.procedimientoActual == null)
            {
                sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre,
                                                               null, tipo);
            }
            else
            {
                sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre,
                                                               C3DSentencias.procedimientoActual.nombre, tipo);
            }
            // Recorrer los valores del arreglo y guardarlos en la posicion empezando en 0
            if (arreglo != null && sid.dimensiones != null)
            {
                List <int> dimensiones = new List <int>();
                dimensionesArreglo(arreglo, ref dimensiones);
                for (int i = 0; i < sid.dimensiones.Count; i++)
                {
                    if (dimensiones[i] != sid.dimensiones[i])
                    {
                        // Error semantico! No es de las dimensiones que solicita!
                        return;
                    }
                }
                // Todo bien!

                /* String t1 = GeneradorC3D.getTemporal();
                 * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                 *   "// Obtener puntero al heap del arreglo " + id));
                 * GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, nodo.estructura, t1, nodo.referencia));
                 */
                int    tamH = sid.getTamanioTotal();
                String t1   = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Guardar H disponible en " + id));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                       nodo.estructura, nodo.referencia, "H"));
                recorrerDimensiones(arreglo, "H");
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Incrementar H para reservar tam del arreglo " + id));
                GeneradorC3D.aumentarHeap(Convert.ToString(tamH));
            }
        }
        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;
            }
        }
예제 #3
0
        //GENERAR CADENAS!
        public static Nodo guardarCadenaC3D(String cadena)
        {
            //CADENA -> tchar | tstring
            Nodo nuevo = new Nodo();

            nuevo.tipo   = (int)Simbolo.Tipo.CADENA;
            nuevo.cadena = GeneradorC3D.getTemporal();
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, "H", "+", "0"));
            foreach (char c in cadena)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar " + c));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Heap", "H", Convert.ToString((int)c)));
                GeneradorC3D.aumentarHeap("1");
            }
            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(nuevo);
        }
        private static void generarC3DMain(Clase clase)
        {
            C3DSentencias.claseActual = clase;
            Simbolo smain = TablaSimbolos.getInstance.getProcedimiento(clase.nombre, "main");

            // Guardar this de la clase main
            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para this y super de " + clase.nombre));
            String t1 = getTemporal();

            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar inicio -> pos 0"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "0", "0"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", "1", "1"));
            GeneradorC3D.aumentarHeap("2");
            // Generar this y super
            generarC3DThis(clase, t1, "Heap");
            // Guardar super de la clase main
            generarC3DSuper(clase, t1, "Heap");
            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Llamada al main"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, clase.nombre + "_main"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Terminar la ejecucion"));
            instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, ""));
        }
 private static void generarC3DClases()
 {
     // Recorrer cada una de las clases
     foreach (Clase clase in clases)
     {
         C3DSentencias.claseActual = clase;
         // Recorrer cada uno de los constructores
         foreach (Procedimiento constructor in clase.constructores)
         {
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            constructor.completo);
             //C3DSentencias.procedimientoActual = constructor.completo;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + constructor.completo));
             // Guardar H en t1
             String t1 = GeneradorC3D.getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador de la instancia"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0"));
             GeneradorC3D.aumentarHeap("2");
             // Generar this y super
             String t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "0"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t1));
             generarC3DThis(clase, t1, "Heap");
             t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "1"));
             String t5 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t5, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t5));
             generarC3DSuper(clase, t1, "Heap");
             String t3 = getTemporal();
             String t4 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t4, "P", "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t4, t3));
             // Sentencias del constructor
             C3DSentencias.generarC3D(constructor.sentencias);
             // Guardar en retorno la posicion del objeto creado
             String temp = C3DSentencias.retornarC3D(constructor.linea, constructor.columna);
             if (!temp.Equals(""))
             {
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                           "// Guardar el retorno en la posicion"));
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp,
                                           t1));
             }
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
         // Recorrer cada uno de los procedimientos
         foreach (Procedimiento procedimiento in clase.procedimientos)
         {
             C3DSentencias.eFinProcedimiento = getEtiqueta();
             //C3DSentencias.procedimientoActual = procedimiento.completo;
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            procedimiento.completo);
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + procedimiento.completo));
             // Sentencias del procedimiento
             C3DSentencias.generarC3D(procedimiento.sentencias);
             generarEtiquetas(C3DSentencias.eFinProcedimiento);
             C3DSentencias.eFinProcedimiento = null;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
     }
 }
        public static 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);
        }