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

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

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

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

            GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
            GeneradorC3D.generarEtiquetas((eSal));
        }
예제 #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 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 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 List <C3D> compilar(String texto, RichTextBox consola, int lenguaje, String clase)
        {
            // *************** FASE 1 Analisis Lexico y Sintactico **************//
            if (lenguaje == (int)Pagina.Lenguaje.OLC)
            {
                // OLC++
                InterpreteOLC interprete = new InterpreteOLC();
                clases = interprete.analizarOLC(texto);
                clase  = clase.Replace(".olc", "");
            }
            else
            {
                // Tree
                InterpreteTree interprete = new InterpreteTree();
                clases = interprete.analizarTree(texto);
                clase  = clase.Replace(".tree", "");
            }
            // **************** FASE 2 Llenar Tabla de Simbolos *****************//
            llenarTablaSimbolos();

            // **************** FASE 3 Analisis Semantico y Codigo Intermedio ***//
            if (clases.Count > 0)
            {
                Clase main = buscarMain(clases[0]);
                if (main == null)
                {
                    // Error! No hay procedimiento main en la clase de inicio!
                    return(null);
                }
                GeneradorC3D.clases = clases;
                return(GeneradorC3D.generarC3D(main));
            }
            return(null);
        }
예제 #6
0
        public static void evaluarRepetirC3D(ParseTreeNode sentencias, ParseTreeNode cond)
        {
            //REPEAT -> Sentencias EXP
            String eAux    = GeneradorC3D.getEtiqueta();
            String eInicio = GeneradorC3D.getEtiqueta();

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

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

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

                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eInicio));
                GeneradorC3D.generarEtiquetas((nhacer.etqVerdadera));
            }
        }
        public static Nodo generarRelacional(String ope, String texto, Nodo nizq, Nodo nder, ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();

            nodo.tipo         = (int)Simbolo.Tipo.BOOLEAN;
            nodo.etqVerdadera = GeneradorC3D.getEtiqueta();
            nodo.etqFalsa     = GeneradorC3D.getEtiqueta();
            if (nizq.tipo == (int)Simbolo.Tipo.NUMERO ||
                nizq.tipo == (int)Simbolo.Tipo.DECIMAL)
            {
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            else if (nizq.tipo == (int)Simbolo.Tipo.CARACTER)
            {
                if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nder = sumarCaracteres(nder.cadena);
                }
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER ||
                    nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            else if (nizq.tipo == (int)Simbolo.Tipo.CADENA)
            {
                nizq = sumarCaracteres(nizq.cadena);
                if (nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    nder = sumarCaracteres(nder.cadena);
                }
                if (nder.tipo == (int)Simbolo.Tipo.CARACTER || nder.tipo == (int)Simbolo.Tipo.CADENA)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si los dos valores son " + ope));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nodo.etqVerdadera, nizq.cadena, ope, nder.cadena));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nodo.etqFalsa));
                    return(nodo);
                }
            }
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede comparar si son " + texto + " el tipo " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }
        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));
            }
        }
예제 #9
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);
        }
예제 #11
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);
        }
예제 #14
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);
        }
예제 #16
0
        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));
            }
        }
        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 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, ""));
        }
        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));
            }
        }
        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);
        }
        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);
            }
        }
예제 #24
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);
                }
            }
        }
 private static void generarC3DClases()
 {
     // Recorrer cada una de las clases
     foreach (Clase clase in clases)
     {
         C3DSentencias.claseActual = clase;
         // Recorrer cada uno de los constructores
         foreach (Procedimiento constructor in clase.constructores)
         {
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            constructor.completo);
             //C3DSentencias.procedimientoActual = constructor.completo;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + constructor.completo));
             // Guardar H en t1
             String t1 = GeneradorC3D.getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador de la instancia"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, "H", "+", "0"));
             GeneradorC3D.aumentarHeap("2");
             // Generar this y super
             String t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "0"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t1));
             generarC3DThis(clase, t1, "Heap");
             t2 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t2, "P", "+", "1"));
             String t5 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t5, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t2, t5));
             generarC3DSuper(clase, t1, "Heap");
             String t3 = getTemporal();
             String t4 = getTemporal();
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t3, t1, "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t4, "P", "+", "1"));
             instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", t4, t3));
             // Sentencias del constructor
             C3DSentencias.generarC3D(constructor.sentencias);
             // Guardar en retorno la posicion del objeto creado
             String temp = C3DSentencias.retornarC3D(constructor.linea, constructor.columna);
             if (!temp.Equals(""))
             {
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                           "// Guardar el retorno en la posicion"));
                 instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", temp,
                                           t1));
             }
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
         // Recorrer cada uno de los procedimientos
         foreach (Procedimiento procedimiento in clase.procedimientos)
         {
             C3DSentencias.eFinProcedimiento = getEtiqueta();
             //C3DSentencias.procedimientoActual = procedimiento.completo;
             C3DSentencias.procedimientoActual = TablaSimbolos.getInstance.getProcedimiento(clase.nombre,
                                                                                            procedimiento.completo);
             instrucciones.Add(new C3D((int)C3D.TipoC3D.INICIO_METODO,
                                       clase.nombre + "_" + procedimiento.completo));
             // Sentencias del procedimiento
             C3DSentencias.generarC3D(procedimiento.sentencias);
             generarEtiquetas(C3DSentencias.eFinProcedimiento);
             C3DSentencias.eFinProcedimiento = null;
             instrucciones.Add(new C3D((int)C3D.TipoC3D.FIN_METODO, "}"));
         }
     }
 }
        public static void generarC3D(ParseTreeNode sentencias)
        {
            foreach (ParseTreeNode sentencia in sentencias.ChildNodes)
            {
                switch (sentencia.Term.Name)
                {
                case "DECLARACION":
                    if (sentencia.ChildNodes.Count == 3)
                    {
                        declararAsignarC3D(sentencia);
                    }
                    break;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                case "LOOP":
                    Loop.evaluarLoopC3D(sentencia.ChildNodes[0].ChildNodes[0]);
                    break;
                }
            }
        }
예제 #27
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);
        }
예제 #28
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);
        }
예제 #29
0
 public static void imprimirC3D(Nodo texp)
 {
     if (texp.tipo == (int)Simbolo.Tipo.NUMERO)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%d", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.DECIMAL)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%f", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.CARACTER)
     {
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else if (texp.tipo == (int)Simbolo.Tipo.CADENA)
     {
         // Ciclo para recorrer la cadena
         String eInicio = GeneradorC3D.getEtiqueta();
         String eAux    = GeneradorC3D.getEtiqueta();
         String eFin    = GeneradorC3D.getEtiqueta();
         String t2      = GeneradorC3D.getTemporal();
         GeneradorC3D.generarEtiquetas(eInicio);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                "Heap", t2, texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                eFin, t2, "==", "0"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                eAux, t2, "!=", "-241094.22"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO,
                                                "Heap", t2, texp.cadena));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%f", t2));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                eInicio));
         GeneradorC3D.generarEtiquetas(eAux);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", t2));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                texp.cadena, texp.cadena, "+", "1"));
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                eInicio));
         GeneradorC3D.generarEtiquetas(eFin);
         GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.IMPRIMIR,
                                                "%c", "13"));
     }
     else
     {
         // Error semantico!
     }
 }
        public static 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);
        }