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);
        }
        public static Nodo generarNativaC3D(Nodo expresion, String nombre, int tipo)
        {
            // Parametros
            // cadena valor : P + 1
            // retorno entero : P + 0
            String tam = Convert.ToString(C3DSentencias.procedimientoActual.tam);

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar la cadena"));
            String t1 = GeneradorC3D.getTemporal();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "P", "+",
                                                   tam));
            String t2 = GeneradorC3D.getTemporal();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, t1, "+", "1"));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t1, expresion.cadena));
            // Aumentar ambito
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tam));
            // Llamar a la funcion nativa
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, nombre));
            // Recuperar el retorno
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Recuperar el retorno"));
            String t3 = GeneradorC3D.getTemporal();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, "P", "+", "0"));
            Nodo nodo = new Nodo();

            nodo.cadena = GeneradorC3D.getTemporal();
            nodo.tipo   = tipo;
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", nodo.cadena, t3));
            // Disminuir ambito
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tam));
            return(nodo);
        }
        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 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);
        }
Esempio n. 5
0
 private static void parametrosC3D(String temp, List <Simbolo> parametros, List <Nodo> expresiones)
 {
     for (int i = 0; i < parametros.Count; i++)
     {
         // Generar C3D de parametro
         String t1 = GeneradorC3D.getTemporal();
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                "// Obtener posicion del parametro"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1,
                                                temp, "+", Convert.ToString(parametros[i].pos)));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                "// Guardar expresion como parametro en la posicion " + i));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t1,
                                                expresiones[i].cadena));
     }
 }
        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 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);
        }
Esempio n. 8
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);
        }
        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 String retornarC3D(int f, int c)
        {
            if (procedimientoActual.rol != (int)Simbolo.Tipo.CONSTRUCTOR)
            {
                if (procedimientoActual.rol == (int)Simbolo.Tipo.METODO)
                {
                    // Error!
                    Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                          "El metodo " + procedimientoActual.nombre + "no tiene retorno!", f, c));
                    return("");
                }
            }
            String temp = GeneradorC3D.getTemporal();

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                   "// Obtener posicion del retorno en el ambito actual "));
            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P",
                                                   "+", "2"));
            return(temp);
        }
        public static Nodo generarAsignacionC3D(string id, ParseTreeNode indices, Acceso.Tipo tipo)
        {
            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);
            }
            if (sid == null)
            {
                // Error Semantico!
                return(null);
            }
            if (sid.dimensiones == null)
            {
                // Error Semantico! No es un arreglo!
                return(null);
            }
            Nodo   nodo = Acceso.generarC3DID(id, tipo, "P", "Stack");
            String tpos = generarParametrizacionC3D(indices, sid);

            if (nodo != null && tpos != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Sumar la posicion del Heap del arreglo y la posicion del arreglo"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nodo.referencia,
                                                       nodo.cadena, "+", tpos));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Obtener el valor en la posicion del arreglo " + id));
                nodo.cadena = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", nodo.cadena,
                                                       nodo.referencia));
            }
            return(nodo);
        }
        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);
        }
 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, "}"));
         }
     }
 }
Esempio n. 14
0
        public static Nodo llamadaC3D(ParseTreeNode llamada, Acceso.Tipo tipo)
        {
            // LLAMADA.Rule = id + apar + EXPS + CPAR
            Nodo   nodo = new Nodo();
            String id   = llamada.ChildNodes[0].Token.Text;
            // Evaluar las expresiones
            List <Nodo> expresiones = new List <Nodo>();
            String      llave       = getExpresiones(llamada.ChildNodes[1], ref expresiones);

            if (llave != null)
            {
                llave = id + llave;
                Simbolo procedimiento;
                // Buscar en la clase que se necesita
                List <Simbolo> sparametros;
                if (tipo == Acceso.Tipo.SUPER)
                {
                    // Buscar en el padre
                    if (C3DSentencias.claseActual.padre == null)
                    {
                        return(null);
                    }
                    procedimiento = TablaSimbolos.getInstance.getProcedimiento(
                        C3DSentencias.claseActual.padre, llave);
                    if (procedimiento == null)
                    {
                        // Error! No existe el procedimiento en la clase padre
                        return(null);
                    }
                    else
                    {
                        if (procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO)
                        {
                            // Error! No se puede acceder a un procedimiento privado!
                            return(null);
                        }
                    }
                    sparametros = TablaSimbolos.getInstance.getParametros(
                        C3DSentencias.claseActual.padre, procedimiento);
                }
                else
                {
                    // Buscar en la clase actual
                    procedimiento = TablaSimbolos.getInstance.getProcedimiento(
                        C3DSentencias.claseActual.nombre, llave);
                    if (procedimiento == null)
                    {
                        // Error! No existe el procedimiento en la clase
                    }
                    sparametros = TablaSimbolos.getInstance.getParametros(
                        C3DSentencias.claseActual.nombre, procedimiento);
                }
                if (expresiones.Count == sparametros.Count)
                {
                    int tam = GeneradorC3D.tamMain;
                    if (C3DSentencias.procedimientoActual != null)
                    {
                        // Esta en el main!
                        tam = C3DSentencias.procedimientoActual.tam;
                    }
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Pasar los parametros"));
                    String taux = GeneradorC3D.getTemporal();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Crear un temporal auxiliar para el incremento del ambito"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux,
                                                           "P", "+", Convert.ToString(tam)));
                    parametrosC3D(taux, sparametros, expresiones);
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Incrementar el ambito"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P",
                                                           "P", "+", Convert.ToString(tam)));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Llamar al procedimiento " + llave));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, procedimiento.padre + "_" + llave));
                    // Ver si hay retorno Y guardarlo
                    if (procedimiento.rol == (int)Simbolo.Tipo.FUNCION)
                    {
                        String temp = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Obtener posicion del retorno en el ambito actual "));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P",
                                                               "+", "2"));
                        nodo.cadena = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Obtener valor del retorno de la funcion " + llave));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack",
                                                               nodo.cadena, temp));
                        nodo.tipo = procedimiento.tipo;
                    }
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Disminuir el ambito "));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P",
                                                           "P", "-", Convert.ToString(tam)));
                }
                else
                {
                    // Error! Faltan parametros!
                    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);
        }
Esempio n. 17
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. 18
0
        public static Nodo instanciaC3D(ParseTreeNode nuevo, Acceso.Tipo tipo)
        {
            // NUEVO -> new id EXPS
            // SUPER -> super [ EXPS ]
            Nodo nodo = new Nodo();
            // NUEVO
            String idC = nuevo.ChildNodes[1].Token.Text;
            // Buscar que la clase exista
            Clase instancia = GeneradorC3D.getClasePadre(idC);

            if (instancia != null)
            {
                List <Nodo> expresiones = new List <Nodo>();
                String      llave       = getExpresiones(nuevo.ChildNodes[2], ref expresiones);
                if (llave != null)
                {
                    llave = "constructor" + llave;
                    Simbolo procedimiento = TablaSimbolos.getInstance.getProcedimiento(
                        instancia.nombre, llave);
                    if (procedimiento == null || procedimiento.visibilidad == (int)Simbolo.Visibilidad.PRIVADO)
                    {
                        // Error Semantico! No se puede hacer instancia por ser privado
                        return(null);
                    }
                    // Get parametros
                    List <Simbolo> sparametros = TablaSimbolos.getInstance.getParametros(
                        instancia.nombre, procedimiento);
                    if (expresiones.Count == sparametros.Count)
                    {
                        int tam = GeneradorC3D.tamMain;
                        if (C3DSentencias.procedimientoActual != null)
                        {
                            // Esta en el main!
                            tam = C3DSentencias.procedimientoActual.tam;
                        }
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Pasar los parametros"));
                        String taux = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Crear un temporal auxiliar para el incremento del ambito"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux,
                                                               "P", "+", Convert.ToString(tam)));
                        parametrosC3D(taux, sparametros, expresiones);
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Incrementar el ambito"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P",
                                                               "P", "+", Convert.ToString(tam)));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Llamar al procedimiento " + llave));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.LLAMADA, instancia.nombre + "_" + llave));
                        // Ver si hay retorno Y guardarlo
                        String temp = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Obtener posicion del retorno en el ambito actual "));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, "P",
                                                               "+", "2"));
                        nodo.cadena = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Obtener valor del retorno de la funcion " + llave));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack",
                                                               nodo.cadena, temp));
                        nodo.tipo = (int)Simbolo.Tipo.CLASE;
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Disminuir el ambito "));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P",
                                                               "P", "-", Convert.ToString(tam)));
                    }
                }
            }

            return(nodo);
        }
        public static Nodo generarC3DID(String id, Tipo tipo, String puntero, String estructura)
        {
            // id
            Simbolo sid;
            Nodo    nodo = new Nodo();

            nodo.estructura = estructura;

            if (C3DSentencias.procedimientoActual == null || actual != null)
            {
                if (actual != null)
                {
                    if (actual.tipo != (int)Simbolo.Tipo.CLASE)
                    {
                        // Error! No es una clase, no se puede acceder!
                        return(null);
                    }
                    estructura = "Heap";
                    sid        = TablaSimbolos.getInstance.buscarVariable(id, actual.clase,
                                                                          null, tipo);
                }
                else
                {
                    sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre,
                                                                   null, tipo);
                }
            }
            else
            {
                sid = TablaSimbolos.getInstance.buscarVariable(id, C3DSentencias.claseActual.nombre,
                                                               C3DSentencias.procedimientoActual.nombre, tipo);
            }
            if (sid != null)
            {
                String pos = "1";
                if (sid.ambito == (int)Simbolo.Tipo.GLOBAL)
                {
                    // Global
                    if ((actual == null && C3DSentencias.claseActual.nombre.Equals(sid.padre)) ||
                        (actual != null && sid.padre.Equals(actual.clase)))
                    {
                        pos = "0";
                    }
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// El " + id + "es global!"));
                    String t1 = GeneradorC3D.getTemporal();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Obtener posicion de este o super"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                           t1, puntero, "+", pos));
                    String t2 = t1;
                    if (estructura.Equals("Stack"))
                    {
                        t2 = GeneradorC3D.getTemporal();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                               "// Obtener posicion del ambito self o super en el Heap"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                               estructura, t2, t1));
                    }
                    estructura = "Heap";
                    String t9 = GeneradorC3D.getTemporal();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Obtener posicion del ambito self o super"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                           estructura, t9, t2));
                    puntero = t9;
                }
                // Generar C3D para buscar la posicion de ID y luego el valor
                String t3 = GeneradorC3D.getTemporal();
                String t4 = GeneradorC3D.getTemporal();
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Obtener posicion del " + id));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                       t3, puntero, "+", Convert.ToString(sid.pos)));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Obtener valor del " + id));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                       estructura, t4, t3));
                actual          = sid;
                nodo.tipo       = sid.tipo;
                nodo.referencia = t3;
                nodo.cadena     = t4;
                nodo.estructura = estructura;
                return(nodo);
            }
            else
            {
                // Error: La variable id no existe!
                return(null);
            }
        }
Esempio n. 20
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!
     }
 }