Example #1
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));
            }
        }
Example #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 negacionC3D(ParseTreeNode exp)
        {
            Nodo cond = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN, Expresion.expresionC3D(exp),
                                             exp.Span.Location.Line, exp.Span.Location.Column);

            if (cond != null)
            {
                if (cond.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    String eTemp = cond.etqVerdadera;
                    cond.etqVerdadera = cond.etqFalsa;
                    cond.etqFalsa     = eTemp;
                }
            }
            return(cond);
        }
        public static 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 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));
            }
        }
Example #6
0
        public static void evaluarXC3D(ParseTreeNode exp1, ParseTreeNode exp2,
                                       ParseTreeNode sentencias)
        {
            //WHILEX -> EXP EXP Sentencias
            String eInicio = GeneradorC3D.getEtiqueta();
            String eSen    = GeneradorC3D.getEtiqueta();
            String eCond   = GeneradorC3D.getEtiqueta();
            String eSalida = GeneradorC3D.getEtiqueta();

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

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

            if (cond1 != null)
            {
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Etiqueta verdadera primera condicion"));
                GeneradorC3D.generarEtiquetas(cond1.etqVerdadera);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Evaluar condicion por primera vez"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                       eSen, taux, "==", "0"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                       eCond));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Etiqueta falsa primera condicion"));
                GeneradorC3D.generarEtiquetas(cond1.etqFalsa);
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL,
                                                       eSalida, taux, "==", "1"));
                GeneradorC3D.generarEtiquetas(eCond);
                Nodo cond2 = Expresion.castearC3D((int)Simbolo.Tipo.BOOLEAN,
                                                  Expresion.expresionC3D(exp2), exp2.Span.Location.Line, exp2.Span.Location.Column);
                if (cond2 != null)
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Etiqueta verdadera segunda condicion"));
                    GeneradorC3D.generarEtiquetas(cond2.etqVerdadera);
                    GeneradorC3D.generarEtiquetas(eSen);
                    GeneradorC3D.display.agregarCiclo((int)Ciclo.TipoCiclo.WHILEX, "", eInicio, eSalida);
                    // Sentencias de X
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Sentencia del ciclo X"));
                    C3DSentencias.generarC3D(sentencias);
                    GeneradorC3D.display.removerCiclo();
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION,
                                                           taux, "1", "", ""));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Salta al inicio"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL,
                                                           eInicio));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Etiqueta falsa segunda condicion y salida"));
                    GeneradorC3D.generarEtiquetas(cond2.etqFalsa);
                    GeneradorC3D.generarEtiquetas(eSalida);
                }
            }
        }
        public static Nodo generarC3D(ParseTreeNode izq, String operador, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();

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