예제 #1
0
        public String generar3D()
        {
            String   codigo      = "";
            cadena3D expresion3D = expresion.resCondicion();

            codigo += expresion3D.codigo;
            return(codigo);
        }
예제 #2
0
        public String generar3D()
        {
            String   codigo      = "";
            cadena3D expresion3D = expresion.resCondicion();

            codigo += "/*Inicio de SI*/" + "\r\n";
            if (expresion3D.tipo == "BOOLEANO")
            {
                codigo += expresion3D.codigo;
                codigo += expresion3D.etqVerdadera + ":" + "\r\n";
                pasadas pasadas = new pasadas(ambito.tablaSimbolo);
                codigo += memoria.identar(pasadas.ejecutar());

                String etiqSalida = memoria.getEtq();
                codigo += "goto " + etiqSalida + ";\r\n";
                codigo += expresion3D.etqFalsa + ":" + "\r\n\n";

                if (lista_sino_si != null)
                {
                    foreach (sino_si sino_si in lista_sino_si)
                    {
                        cadena3D expresion3D_sino_si = sino_si.expresion.resCondicion();

                        if (expresion3D.tipo == "BOOLEANO")
                        {
                            codigo += "//Inicio de sino_si" + "\r\n";
                            codigo += expresion3D_sino_si.codigo;
                            codigo += expresion3D_sino_si.etqVerdadera + ":" + "\r\n";
                            pasadas = new pasadas(sino_si.ambito.tablaSimbolo);
                            codigo += memoria.identar(pasadas.ejecutar());
                            codigo += "goto " + etiqSalida + ";\r\n";
                            codigo += expresion3D_sino_si.etqFalsa + ":" + "\r\n";
                            codigo += "//Fin de sino_si" + "\r\n\n";
                        }
                        else
                        {
                            memoria.addError("ERROR SEMANTICO ", "La condicion SI_NO_SI debe ser de tipo booleano", sino_si.expresion.fila, sino_si.expresion.columna);
                        }
                    }
                }

                if (sino != null)
                {
                    codigo += "//Inicio de sino" + "\r\n";
                    pasadas = new pasadas(sino.ambito.tablaSimbolo);
                    codigo += memoria.identar(pasadas.ejecutar());
                    codigo += "//Inicio de sino" + "\r\n";
                }
                codigo += etiqSalida + ":" + "\r\n";
                codigo += "/*Fin de SI*/" + "\r\n\n";
            }
            else
            {
                memoria.addError("ERROR SEMANTICO ", "La condicion SI debe ser de tipo booleano", expresion.fila, expresion.columna);
            }
            return(codigo);
        }
예제 #3
0
        public String generar3D()
        {
            String   codigo      = "";
            cadena3D expresion3D = expresion.resCondicion();
            pasadas  pasadas     = new pasadas(ambito.tablaSimbolo);

            if (expresion3D.tipo.Equals("BOOLEANO"))
            {
                codigo += "/*Inicio del ciclo REPETIR-HASTA*/" + "\r\n";

                //Para el caso de HACER-MIENTRAS(True)
                if (expresion3D.etqVerdadera == "" && expresion3D.etqFalsa == "")
                {
                    expresion3D.etqVerdadera = memoria.getEtq();
                    expresion3D.etqFalsa     = memoria.getEtq();

                    codigo += expresion3D.etqFalsa + ":" + "\r\n";

                    /*Se concatena las sentencias dentro del repetir_hasta*/
                    codigo += memoria.identar(pasadas.ejecutar());
                    /*Se concatena las sentencias dentro del repetir_hasta*/

                    codigo += expresion3D.codigo;

                    codigo += "\t" + "if " + expresion3D.temporal + "==1 goto " + expresion3D.etqVerdadera + ";\n";
                    codigo += "\t" + "goto " + expresion3D.etqFalsa + ";\n";
                }

                else
                {
                    codigo += expresion3D.etqFalsa + ":" + "\r\n";

                    /*Se concatena las sentencias dentro del repetir_hasta*/
                    codigo += memoria.identar(pasadas.ejecutar());
                    /*Se concatena las sentencias dentro del repetir_hasta*/

                    codigo += expresion3D.codigo;
                }

                codigo += expresion3D.etqVerdadera + ":" + "\r\n";
                codigo += "/*Fin del ciclo REPETIR-HASTA*/" + "\r\n\n";
            }
            else
            {
                memoria.addError("ERROR SEMANTICO ", "La condicion debe ser de tipo booleano", expresion.fila, expresion.columna);
            }

            //Goto etiqueta de retorno y salida
            codigo = memoria.reemplazar(codigo, "goto " + expresion3D.etqVerdadera + ";", "goto " + expresion3D.etqFalsa + ";");
            //Goto etiqueta de retorno y salida
            return(codigo);
        }
예제 #4
0
        public String generar3D()
        {
            String codigo       = "";
            String etq1         = memoria.getEtq();
            String etqVerdadera = memoria.getEtq();
            String etqFalsa     = memoria.getEtq();
            String etqSalida    = memoria.getEtq();

            expresion expresion_or  = new expresion(expresion1, expresion2, "||", "||", fila, columna, null);
            expresion expresion_and = new expresion(expresion1, expresion2, "&&", "&&", fila, columna, null);

            cadena3D expresion3D_OR = expresion_or.resCondicion();

            if (expresion3D_OR.tipo.Equals("BOOLEANO"))
            {
                codigo += "/*Inicio del ciclo X*/" + "\r\n";
                codigo += etq1 + ":" + "\r\n";
                codigo += expresion3D_OR.codigo;
                codigo += expresion3D_OR.etqVerdadera + ":" + "\r\n";
                codigo += memoria.identar("goto " + etqVerdadera + ";\r\n");
                codigo += expresion3D_OR.etqFalsa + ":" + "\r\n";
                codigo += memoria.identar("goto " + etqSalida + ";\r\n");

                codigo += etqVerdadera + ":" + "\r\n";
                /*Se concatena las sentencias dentro del mientras*/
                pasadas pasadas = new pasadas(ambito.tablaSimbolo);
                codigo += memoria.identar(pasadas.ejecutar());
                /*Se concatena las sentencias dentro del mientras*/
                cadena3D expresion3D_AND = expresion_and.resCondicion();
                codigo += expresion3D_AND.codigo;
                codigo += expresion3D_AND.etqVerdadera + ":" + "\r\n";
                codigo += memoria.identar("goto " + etqVerdadera + ";\r\n");
                codigo += expresion3D_AND.etqFalsa + ":" + "\r\n";
                codigo += memoria.identar("goto " + etqSalida + ";\r\n");

                codigo += etqSalida + ":" + "\r\n";
                codigo += "/*Fin del ciclo X*/" + "\r\n\n";
            }
            else
            {
                memoria.addError("ERROR SEMANTICO ", "La condicion debe ser de tipo booleano", fila, columna);
            }
            //Goto etiqueta de retorno y salida
            codigo = memoria.reemplazar(codigo, "goto " + etqSalida + ";", "goto " + etq1 + ";");
            //Goto etiqueta de retorno y salida
            return(codigo);
        }
예제 #5
0
        public String generar3D()
        {
            String codigo = "";

            codigo += "/*Inicio del ciclo para*/" + "\r\n";
            if (declara_asigna.rol.Equals("DECLARACION"))
            {
                declaracion declaracion = (declaracion)declara_asigna.valor;
                codigo += declaracion.generar3D();
            }
            else
            {
                asignacion asignacion = (asignacion)declara_asigna.valor;
                codigo += asignacion.generar3D();
            }

            String   etqRetorno  = memoria.getEtq();
            cadena3D expresion3D = condicion.resCondicion();

            if (expresion3D.tipo.Equals("BOOLEANO"))
            {
                codigo += etqRetorno + ":" + "\r\n";
                codigo += expresion3D.codigo;
                codigo += expresion3D.etqVerdadera + ":" + "\r\n";

                /*Se concatena las sentencias dentro del for*/
                pasadas pasadas = new pasadas(ambito.tablaSimbolo);
                codigo += memoria.identar(pasadas.ejecutar());
                /*Se concatena las sentencias dentro del for*/

                codigo += ((aumento_decremento)decre_aum.valor).generar3D();

                codigo += "goto " + etqRetorno + ";\r\n";
                codigo += expresion3D.etqFalsa + ":" + "\r\n";
            }
            else
            {
                memoria.addError("ERROR SEMANTICO ", "La condicion debe ser de tipo booleano", condicion.fila, condicion.columna);
            }
            codigo += "/*Fin del ciclo para*/" + "\r\n\n";

            //Goto etiqueta de retorno y salida
            codigo = memoria.reemplazar(codigo, "goto " + expresion3D.etqFalsa + ";", "goto " + etqRetorno + ";");
            //Goto etiqueta de retorno y salida
            return(codigo);
        }
예제 #6
0
        public String generar3D()
        {
            String   codigo      = "";
            cadena3D expresion3D = expresion.resCondicion();
            String   etiqSalida  = memoria.getEtq();

            codigo += "/*Inicio de Elegir*/" + "\r\n";
            codigo += expresion3D.codigo;
            if (lista_caso != null)
            {
                foreach (caso caso in lista_caso)
                {
                    cadena3D expresion_caso = caso.expresion.resCondicion();
                    codigo += expresion_caso.codigo;
                    String etiqFalsa = memoria.getEtq();
                    codigo += "//Inicio de  caso" + "\r\n";
                    codigo += "ifFalse " + expresion3D.temporal + "==" + expresion_caso.temporal + " goto " + etiqFalsa + "; \r\n";
                    pasadas pasadas = new pasadas(caso.ambito.tablaSimbolo);
                    codigo += memoria.identar(pasadas.ejecutar());
                    codigo += etiqFalsa + ": \r\n";
                    codigo += "//Fin de caso" + "\r\n";
                }
            }

            if (defecto != null)
            {
                codigo += "//Inicio Defecto" + "\r\n";
                pasadas pasadas = new pasadas(defecto.ambito.tablaSimbolo);
                codigo += memoria.identar(pasadas.ejecutar());
                codigo += "//Fin Defecto" + "\r\n";
            }
            codigo += etiqSalida + ":" + "\r\n";
            codigo += "/*Fin de Elegir*/" + "\r\n\n";

            codigo = memoria.reemplazar(codigo, "goto " + etiqSalida + ";", "");
            return(codigo);
        }
예제 #7
0
        public String generar3D()
        {
            String   codigo      = "";
            cadena3D expresion3D = expresion.resCondicion();

            if (expresion3D.temporal != "")
            {
                if (expresion3D.tipo == "ENTERO")
                {
                    codigo += "/*Inicio impresion de entero*/" + "\r\n";
                    codigo += expresion3D.codigo;
                    codigo += "print(\"%d\"," + expresion3D.temporal + ");" + "\r\n";
                    codigo += "/*Fin impresion de entero*/" + "\r\n\n";
                }
                else if (expresion3D.tipo == "DECIMAL")
                {
                    codigo += "/*Inicio impresion de decimal*/" + "\r\n";
                    codigo += expresion3D.codigo;
                    codigo += "print(\"%f\"," + expresion3D.temporal + ");" + "\r\n";
                    codigo += "/*Fin impresion de decimal*/" + "\r\n\n";
                }
                else if (expresion3D.tipo == "BOOLEANO")
                {
                    codigo += "/*Inicio impresion de booleano*/" + "\r\n";
                    codigo += expresion3D.codigo;
                    codigo += "print(\"%d\"," + expresion3D.temporal + ");" + "\r\n";
                    codigo += "/*Fin impresion de booleano*/" + "\r\n\n";
                }
                else if (expresion3D.tipo == "CARACTER")
                {
                    codigo += "/*Inicio impresion de caracter*/" + "\r\n";
                    codigo += expresion3D.codigo;
                    codigo += "print(\"%c\"," + expresion3D.temporal + ");" + "\r\n";
                    codigo += "/*Fin impresion de caracter*/" + "\r\n\n";
                }
                else if (expresion3D.tipo == "CADENA")
                {
                    String temp1 = memoria.getTemp();
                    String temp2 = memoria.getTemp();
                    String etq1  = memoria.getEtq();
                    String etq2  = memoria.getEtq();

                    codigo += "/*Inicio impresion de cadena*/" + "\r\n";
                    codigo += expresion3D.codigo + "\r\n";
                    codigo += temp1 + "=" + expresion3D.temporal + "; //Posicion Heap cadena" + "\r\n";
                    codigo += etq1 + ":" + "\r\n";
                    codigo += temp2 + "=" + "Heap[" + temp1 + "]; //Asignar ascii" + "\r\n";
                    codigo += "if " + temp2 + "==0 goto " + etq2 + ";" + "\r\n";
                    codigo += "print(\"%c\"," + temp2 + ");" + "\r\n";
                    codigo += temp1 + "=" + temp1 + "+1" + ";" + "\r\n";
                    codigo += "goto " + etq1 + ";" + "\r\n";
                    codigo += etq2 + ":" + "\r\n";
                    codigo += "/*Fin impresion de cadena*/" + "\r\n\n";
                }
            }
            else
            {
                memoria.addError("ERROR SEMANTICO ", "La expresion debe retonar un temporal", expresion.fila, expresion.columna);
            }
            return(codigo);
        }
예제 #8
0
        public String generar3D()
        {
            String codigo = "";

            if (expresion != null)
            {
                /*Declaracion y asignacion*/
                cadena3D expresion3D = expresion.resCondicion();
                if (tipo.Equals("ENTERO"))
                {
                    if (expresion3D.tipo.Equals("ENTERO") || expresion3D.tipo.Equals("DECIMAL") || expresion3D.tipo.Equals("CARACTER") || expresion3D.tipo.Equals("BOOLEANO"))
                    {
                        codigo += "/*Inicio Declaracion*/" + "\r\n";
                        codigo += expresion3D.codigo;
                        String temp = memoria.getTemp();
                        codigo += temp + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                        codigo += "Stack[" + temp + "]=" + expresion3D.temporal + ";" + "\r\n";
                        codigo += "/*Fin Declaracion*/" + "\r\n\n";
                    }
                    else
                    {
                        memoria.addError("ERROR SEMANTICO ", tipo + " -NO COINCIDEN TIPOS- " + expresion3D.tipo, fila, columna);
                    }
                }
                else if (tipo.Equals("DECIMAL"))
                {
                    if (expresion3D.tipo.Equals("ENTERO") || expresion3D.tipo.Equals("DECIMAL") || expresion3D.tipo.Equals("CARACTER") || expresion3D.tipo.Equals("BOOLEANO"))
                    {
                        codigo += "/*Inicio Declaracion*/" + "\r\n";
                        codigo += expresion3D.codigo;
                        String temp = memoria.getTemp();
                        codigo += temp + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                        codigo += "Stack[" + temp + "]=" + expresion3D.temporal + ";" + "\r\n";
                        codigo += "/*Fin Declaracion*/" + "\r\n\n";
                    }
                    else
                    {
                        memoria.addError("ERROR SEMANTICO ", tipo + " -NO COINCIDEN TIPOS- " + expresion3D.tipo, fila, columna);
                    }
                }
                else if (tipo.Equals("CARACTER"))
                {
                    if (expresion3D.tipo.Equals("ENTERO") || expresion3D.tipo.Equals("CARACTER"))
                    {
                        codigo += "/*Inicio Declaracion*/" + "\r\n";
                        codigo += expresion3D.codigo;
                        String temp = memoria.getTemp();
                        codigo += temp + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                        codigo += "Stack[" + temp + "]=" + expresion3D.temporal + ";" + "\r\n";
                        codigo += "/*Fin Declaracion*/" + "\r\n\n";
                    }
                    else
                    {
                        memoria.addError("ERROR SEMANTICO ", tipo + " -NO COINCIDEN TIPOS- " + expresion3D.tipo, fila, columna);
                    }
                }
                else if (tipo.Equals("CADENA"))
                {
                    if (expresion3D.tipo.Equals("CADENA"))
                    {
                        codigo += "/*Inicio Declaracion*/" + "\r\n";
                        codigo += expresion3D.codigo;
                        String temp = memoria.getTemp();
                        codigo += temp + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                        codigo += "Stack[" + temp + "]=" + expresion3D.temporal + ";" + "\r\n";
                        codigo += "/*Inicio Declaracion*/" + "\r\n\n";
                    }
                    else
                    {
                        memoria.addError("ERROR SEMANTICO ", tipo + " -NO COINCIDEN TIPOS- " + expresion3D.tipo, fila, columna);
                    }
                }
            }
            else
            {
                if (dimensiones.Count > 0)
                {
                    /*Declaracion arreglo*/
                    codigo += "/*Inicio Declaracion Arreglo*/" + "\r\n";
                    String temp_pos_heap  = memoria.getTemp();
                    String temp_pos_stack = memoria.getTemp();
                    String temp_dimension = memoria.getTemp();

                    codigo += temp_pos_heap + "=H" + ";" + "\r\n";
                    codigo += temp_pos_stack + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                    codigo += "Stack[" + temp_pos_stack + "]=" + temp_pos_heap + ";" + "\r\n";

                    String temp_num_dimensiones = memoria.getTemp();
                    codigo += temp_num_dimensiones + "=" + dimensiones.Count + ";" + "\r\n";
                    codigo += "Heap[H]=" + temp_num_dimensiones + ";" + " //Numero de dimensiones del arreglo \r\n";
                    codigo += "H = H + 1;" + "\r\n\n";

                    codigo += temp_dimension + "=1;" + "\r\n\n";

                    foreach (expresion expresion in dimensiones)
                    {
                        cadena3D expresion3D = expresion.resCondicion();
                        codigo += "//Inicio valor dimension" + "\r\n";
                        codigo += expresion3D.codigo;
                        codigo += "Heap[H]=" + expresion3D.temporal + ";" + "\r\n";
                        codigo += "//Fin valor dimension" + "\r\n\n";
                        codigo += "H = H + 1;" + "\r\n";
                        codigo += temp_dimension + "=" + temp_dimension + " * " + expresion3D.temporal + "; //Numero dimensiones que se necesitan apartar en el Heap" + "\r\n\n";
                    }

                    codigo += "H = H + " + temp_dimension + "; //Se apartan las posiciones en el Heap" + "\r\n";
                    codigo += "/*Fin Declaracion Arreglo*/" + "\r\n\n";
                }
                else
                {
                    /*Declaracion nulo*/
                    codigo += "/*Inicio Declaracion*/" + "\r\n";
                    String temp = memoria.getTemp();
                    codigo += temp + "=" + "P+" + padre.posicion.ToString() + ";" + "\r\n";
                    codigo += "Stack[" + temp + "]=" + memoria.inicia_variable + ";" + "\r\n";
                    codigo += "/*Fin Declaracion*/" + "\r\n\n";
                }
            }
            return(codigo);
        }