示例#1
0
        public static void getReporteTS(TablaSimbolos ts, ref DataGridView tabla)
        {
            /*public String nombre, padre, clase;
             * public int ambito, tipo, rol, pos, tam;
             * //public int fila, columna;
             * public List<int> dimensiones;*/

            tabla.Columns.Add(crearColumna("#"));
            tabla.Columns.Add(crearColumna("Rol"));
            tabla.Columns.Add(crearColumna("Nombre"));
            tabla.Columns.Add(crearColumna("Padre"));
            tabla.Columns.Add(crearColumna("Tipo"));
            tabla.Columns.Add(crearColumna("Clase"));
            tabla.Columns.Add(crearColumna("Ambito"));
            tabla.Columns.Add(crearColumna("Visibilidad"));
            tabla.Columns.Add(crearColumna("Posicion"));
            tabla.Columns.Add(crearColumna("Tamaño"));
            tabla.Columns.Add(crearColumna("Dimensiones"));
            int id = 1;

            foreach (Simbolo simbolo in ts)
            {
                object[] fila = new object[11];
                fila[0] = id;
                fila[1] = Simbolo.getValor(simbolo.rol);
                fila[2] = simbolo.nombre;
                fila[3] = simbolo.padre;
                fila[4] = Simbolo.getValor(simbolo.tipo);
                fila[5] = simbolo.clase;
                if (simbolo.clase == null)
                {
                    fila[5] = "--------";
                }
                fila[6]  = Simbolo.getValor(simbolo.ambito);
                fila[7]  = Simbolo.getVisibilidad(simbolo.visibilidad);
                fila[8]  = simbolo.pos;
                fila[9]  = simbolo.tam;
                fila[10] = "--------";
                if (simbolo.dimensiones != null)
                {
                    fila[10] = "";
                    foreach (int v in simbolo.dimensiones)
                    {
                        fila[10] += v + " ";
                    }
                }
                tabla.Rows.Add(fila);
                id++;
            }
        }
        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);
        }
        public Simbolo guardarSuper(String padre)
        {
            Simbolo seste = new Simbolo();

            seste.ambito      = (int)Simbolo.Tipo.LOCAL;
            seste.clase       = "";
            seste.nombre      = "super";
            seste.padre       = padre;
            seste.pos         = 1;
            seste.rol         = (int)Simbolo.Tipo.VARIABLE;
            seste.tam         = 1;
            seste.tipo        = -1;
            seste.dimensiones = null;
            return(seste);
        }
        public static String getNombreProcedimiento(Procedimiento proc)
        {
            String nombre = proc.nombre;

            if (proc.parametros != null)
            {
                if (proc.parametros.Count > 0)
                {
                    foreach (Atributo p in proc.parametros)
                    {
                        nombre += "_" + Simbolo.getValor(p.tipo);
                    }
                }
            }
            return(nombre);
        }
        public Simbolo guardarSimboloConstructor(String padre, Procedimiento constructor)
        {
            Simbolo sconstructor = new Simbolo();

            sconstructor.ambito      = (int)Simbolo.Tipo.GLOBAL;
            sconstructor.visibilidad = constructor.visibilidad;
            sconstructor.clase       = "";
            sconstructor.dimensiones = null;
            sconstructor.nombre      = constructor.completo;
            sconstructor.padre       = padre;
            sconstructor.pos         = -1;
            sconstructor.rol         = (int)Simbolo.Tipo.CONSTRUCTOR;
            sconstructor.tam         = tamanio;
            sconstructor.tipo        = -1;
            return(sconstructor);
        }
示例#6
0
        private static String getExpresiones(ParseTreeNode expresiones, ref List <Nodo> exps)
        {
            String cadena = "";

            foreach (ParseTreeNode nexp in expresiones.ChildNodes)
            {
                Nodo exp = Expresion.expresionC3D(nexp);
                if (exp == null)
                {
                    return(null);
                }
                exps.Add(exp);
                cadena += "_" + Simbolo.getValor(exp.tipo);
            }
            return(cadena);
        }
        public static Nodo generarC3DAcceso(ParseTreeNode acceso, Tipo tipo, Nodo nExp)
        {
            actual = null;
            Nodo   nodo       = null;
            String puntero    = "P";
            String estructura = "Stack";

            foreach (ParseTreeNode objeto in acceso.ChildNodes)
            {
                if (objeto.Term.Name.Equals("id"))
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Accediendo a un id " + objeto.Token.Text));
                    nodo = generarC3DID(objeto.Token.Text, tipo, puntero, estructura);
                }
                else if (objeto.Term.Name.Equals("NARREGLO"))
                {
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Accediendo a un arreglo"));
                    nodo = Arreglo.generarAsignacionC3D(objeto.ChildNodes[0].Token.Text,
                                                        objeto.ChildNodes[1], tipo);
                }
                else
                {
                    // llamada con retorno
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                           "// Accediendo a una llamada"));
                    nodo = Llamada.llamadaC3D(objeto, tipo);
                }
                tipo = Tipo.ESTE;
                if (nodo != null)
                {
                    estructura = nodo.estructura;
                    puntero    = nodo.cadena;
                }
            }
            if (nExp != null)
            {
                // Asignar el valor a la variable!
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO,
                                                       "// Asignar el valor a la variable del acceso"));
                GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                       nodo.estructura, nodo.referencia, nExp.cadena));
            }
            return(nodo);
        }
        private void btnAgregarProcedimiento_Click(object sender, EventArgs e)
        {
            // Guardar datos de procedimiento
            int    vis        = Simbolo.getVisibilidad(visibilidad.SelectedItem.ToString().ToLower());
            String stipo      = tipo.SelectedItem.ToString().ToLower();
            int    tipo_valor = Simbolo.getTipo(stipo);
            String nombre     = txtNombre.Text;

            // Guardar el procedimiento en la lista de procedimientos
            listProcedimientos.Items.Add(getValor(nombre, vis) + "() : " + stipo);
            // Guardar el procedimiento en la clase
            clase.agregarProcedimiento(new Procedimiento(nombre, tipo_valor, vis, null, null, false, listProcedimientos.Items.Count, 0));
            // Limpiar
            visibilidad.ResetText();
            tipo.ResetText();
            txtNombre.Text = "";
        }
示例#9
0
        public String getValor()
        {
            String val = "";

            switch (visibilidad)
            {
            case (int)Simbolo.Visibilidad.PUBLICO:
                val = "+ " + nombre;
                break;

            case (int)Simbolo.Visibilidad.PRIVADO:
                val = "- " + nombre;
                break;

            default:
                val = "# " + nombre;
                break;
            }
            return(val + " : " + Simbolo.getValor(tipo));
        }
        public Simbolo guardarSimboloParametro(String padre, Atributo parametro)
        {
            Simbolo sparametro = new Simbolo();

            sparametro.ambito = (int)Simbolo.Tipo.LOCAL;
            sparametro.clase  = "";
            if (parametro.tipo == (int)Simbolo.Tipo.CLASE)
            {
                sparametro.clase = parametro.clase;
            }
            sparametro.dimensiones = parametro.dimensiones;
            sparametro.nombre      = parametro.nombre;
            sparametro.padre       = padre;
            sparametro.pos         = tamanio;
            tamanio++;
            sparametro.rol  = (int)Simbolo.Tipo.PARAMETRO;
            sparametro.tam  = 1;
            sparametro.tipo = parametro.tipo;
            return(sparametro);
        }
        private static void generarC3DThis(Clase clase, String puntero, String estructura)
        {
            Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre);

            if (sclase != null)
            {
                String t1 = getTemporal();
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del this"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "0"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador donde incia el this"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para globales de " + clase.nombre));
                aumentarHeap(Convert.ToString(sclase.tam));
                // Recorrer las variables globales y asignarles
                foreach (Atributo atr in clase.atributos)
                {
                    if (atr.esArreglo)
                    {
                        Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.ESTE);
                    }
                    else
                    {
                        if (atr.valor != null)
                        {
                            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre));
                            Nodo exp = Expresion.expresionC3D(atr.valor);
                            Acceso.actual = null;
                            instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre));
                            Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.ESTE, "P", "Stack");
                            if (nodo != null)
                            {
                                // Asignar la expresion
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Asignar expresion al atributo " + atr.nombre));
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                          nodo.estructura, nodo.referencia, exp.cadena));
                            }
                        }
                    }
                }
            }
        }
示例#12
0
        public String generarCodigoAtributos(Clase clase)
        {
            String cadena = "";

            foreach (Atributo a in clase.atributos)
            {
                if (tipoArchivo.SelectedIndex == 0)
                {
                    // OLC++
                    cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " "
                              + a.nombre + ";\n";
                }
                else if (tipoArchivo.SelectedIndex == 1)
                {
                    // Tree
                    cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " "
                              + a.nombre + "\n";
                }
            }
            return(cadena);
        }
        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);
        }
        public Simbolo guardarSimboloProcedimiento(String padre, Procedimiento procedimiento)
        {
            Simbolo sprocedimiento = new Simbolo();

            sprocedimiento.ambito      = (int)Simbolo.Tipo.GLOBAL;
            sprocedimiento.clase       = "";
            sprocedimiento.dimensiones = null;
            sprocedimiento.nombre      = procedimiento.completo;
            sprocedimiento.visibilidad = procedimiento.visibilidad;
            sprocedimiento.padre       = padre;
            sprocedimiento.tam         = tamanio;
            sprocedimiento.tipo        = procedimiento.tipo;
            sprocedimiento.rol         = (int)Simbolo.Tipo.FUNCION;
            if (procedimiento.tipo == (int)Simbolo.Tipo.VACIO)
            {
                sprocedimiento.rol = (int)Simbolo.Tipo.METODO;
            }
            if (procedimiento.tipo == (int)Simbolo.Tipo.CLASE)
            {
                sprocedimiento.clase = procedimiento.clase;
            }
            return(sprocedimiento);
        }
        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, ""));
        }
示例#16
0
        public List <Atributo> guardarParametros(ParseTreeNode nodo)
        {
            List <Atributo> parametros = new List <Atributo>();

            foreach (ParseTreeNode pa in nodo.ChildNodes)
            {
                // PARAMETRO -> TIPO NARREGLO -> id INDICES
                int      tipo      = Simbolo.getTipo(pa.ChildNodes[0].Token.Text);
                Atributo parametro = new Atributo(pa.ChildNodes[1].Token.Text, tipo,
                                                  pa.ChildNodes[1].Token.Location.Line,
                                                  pa.ChildNodes[1].Token.Location.Column);
                if (tipo == (int)Simbolo.Tipo.CLASE)
                {
                    parametro.asignarClase(pa.ChildNodes[0].ChildNodes[0].Token.Text);
                }
                if (pa.ChildNodes[2].ChildNodes.Count > 0)
                {
                    parametro.asignarArreglo(pa.ChildNodes[2]);
                }
                parametros.Add(parametro);
            }
            return(parametros);
        }
        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);
        }
示例#18
0
        public String generarCodigoProcedimientos(Clase clase)
        {
            String cadena = "";

            foreach (Procedimiento a in clase.procedimientos)
            {
                if (tipoArchivo.SelectedIndex == 0)
                {
                    // OLC++
                    cadena += "\t" + getVisibilidad(a.visibilidad) + " " + Simbolo.getValor(a.tipo) + " "
                              + a.nombre + "(){\n\n\t}\n\n";
                }
                else if (tipoArchivo.SelectedIndex == 1)
                {
                    // Tree
                    if (a.tipo == (int)Simbolo.Tipo.VACIO)
                    {
                        cadena += "\t" + getVisibilidad(a.visibilidad) + " metodo " + a.nombre + "():\n\n";
                    }
                    else
                    {
                        cadena += "\t" + getVisibilidad(a.visibilidad) + " funcion " + Simbolo.getValor(a.tipo) + " " + a.nombre + "():\n\n";
                    }
                }
            }
            return(cadena);
        }
示例#19
0
        public Procedimiento guardarProcedimiento(ParseTreeNode nodo)
        {
            /*
             * METODO -> sobreescribir VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE
             | VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE
             | sobreescribir TPROC id LISTA_PARAMETROS BLOQUE
             | TPROC id LISTA_PARAMETROS BLOQUE
             */
            List <Atributo> parametros;

            if (nodo.ChildNodes.Count == 6)
            {
                // METODO -> sobreescribir VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE
                parametros = guardarParametros(nodo.ChildNodes[4]);
                String id  = nodo.ChildNodes[3].Token.Text;
                int    vis = Simbolo.getVisibilidad(nodo.ChildNodes[1].ChildNodes[0].Token.Text);
                if (nodo.ChildNodes[2].ChildNodes.Count == 3)
                {
                    int           tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                    Procedimiento proc = new Procedimiento(id, tipo, vis,
                                                           parametros, nodo.ChildNodes[5].ChildNodes[0], true,
                                                           nodo.ChildNodes[3].Token.Location.Line,
                                                           nodo.ChildNodes[3].Token.Location.Column);
                    if (tipo == (int)Simbolo.Tipo.CLASE)
                    {
                        proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                    }
                    if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0)
                    {
                        proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]);
                    }
                    return(proc);
                }
                else
                {
                    return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, vis, parametros,
                                             nodo.ChildNodes[5].ChildNodes[0], true,
                                             nodo.ChildNodes[3].Token.Location.Line,
                                             nodo.ChildNodes[3].Token.Location.Column));
                }
            }
            else if (nodo.ChildNodes.Count == 5)
            {
                /*
                 * METODO -> VISIBILIDAD TPROC id LISTA_PARAMETROS BLOQUE
                 | sobreescribir TPROC id LISTA_PARAMETROS BLOQUE
                 */
                parametros = guardarParametros(nodo.ChildNodes[3]);
                String id = nodo.ChildNodes[2].Token.Text;
                if (nodo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD"))
                {
                    int vis = Simbolo.getVisibilidad(nodo.ChildNodes[0].ChildNodes[0].Token.Text);
                    if (nodo.ChildNodes[2].ChildNodes.Count == 3)
                    {
                        int           tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                        Procedimiento proc = new Procedimiento(id, tipo, vis,
                                                               parametros, nodo.ChildNodes[4].ChildNodes[0], false,
                                                               nodo.ChildNodes[2].Token.Location.Line,
                                                               nodo.ChildNodes[2].Token.Location.Column);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                        }
                        if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0)
                        {
                            proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]);
                        }
                        return(proc);
                    }
                    else
                    {
                        return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, vis, parametros,
                                                 nodo.ChildNodes[4].ChildNodes[0], false,
                                                 nodo.ChildNodes[2].Token.Location.Line,
                                                 nodo.ChildNodes[2].Token.Location.Column));
                    }
                }
                else
                {
                    if (nodo.ChildNodes[2].ChildNodes.Count == 3)
                    {
                        int           tipo = Simbolo.getTipo(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                        Procedimiento proc = new Procedimiento(id, tipo,
                                                               parametros, nodo.ChildNodes[4].ChildNodes[0], true,
                                                               nodo.ChildNodes[2].Token.Location.Line,
                                                               nodo.ChildNodes[2].Token.Location.Column);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            proc.agregarClase(nodo.ChildNodes[2].ChildNodes[1].Token.Text);
                        }
                        if (nodo.ChildNodes[2].ChildNodes[2].ChildNodes.Count > 0)
                        {
                            proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]);
                        }
                        return(proc);
                    }
                    else
                    {
                        return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, parametros,
                                                 nodo.ChildNodes[4].ChildNodes[0], true,
                                                 nodo.ChildNodes[2].Token.Location.Line,
                                                 nodo.ChildNodes[2].Token.Location.Column));
                    }
                }
            }
            else
            {
                // METODO -> TPROC id LISTA_PARAMETROS BLOQUE
                parametros = guardarParametros(nodo.ChildNodes[2]);
                String id = nodo.ChildNodes[1].Token.Text;
                if (nodo.ChildNodes[0].ChildNodes.Count == 3)
                {
                    int           tipo = Simbolo.getTipo(nodo.ChildNodes[0].ChildNodes[1].Token.Text);
                    Procedimiento proc = new Procedimiento(id, tipo,
                                                           parametros, nodo.ChildNodes[3].ChildNodes[0], false,
                                                           nodo.ChildNodes[1].Token.Location.Line,
                                                           nodo.ChildNodes[1].Token.Location.Column);
                    if (tipo == (int)Simbolo.Tipo.CLASE)
                    {
                        proc.agregarClase(nodo.ChildNodes[0].ChildNodes[1].Token.Text);
                    }
                    if (nodo.ChildNodes[0].ChildNodes[2].ChildNodes.Count > 0)
                    {
                        proc.agregarArreglo(nodo.ChildNodes[2].ChildNodes[2]);
                    }
                    return(proc);
                }
                else
                {
                    return(new Procedimiento(id, (int)Simbolo.Tipo.VACIO, parametros,
                                             nodo.ChildNodes[3].ChildNodes[0], false,
                                             nodo.ChildNodes[1].Token.Location.Line,
                                             nodo.ChildNodes[1].Token.Location.Column));
                }
            }
        }
示例#20
0
        public Clase guardarClase(ParseTreeNode clase)
        {
            // CLASE -> id BCUERPO | id id BCUERPO
            Clase  nueva;
            String nombre_clase = clase.ChildNodes.ElementAt(0).Token.Value.ToString();
            int    pos          = 1;

            if (clase.ChildNodes.Count == 2)
            {
                nueva = new Clase(nombre_clase, clase.ChildNodes[0].Token.Location.Line,
                                  clase.ChildNodes[0].Token.Location.Line);
            }
            else
            {
                // Tiene padre
                String padre = clase.ChildNodes.ElementAt(1).Token.Value.ToString();
                nueva = new Clase(nombre_clase, padre, clase.ChildNodes[0].Token.Location.Line,
                                  clase.ChildNodes[0].Token.Location.Line);
                pos++;
            }
            // Recorrer atributos, constructores y procedimientos
            ParseTreeNode cuerpos = clase.ChildNodes.ElementAt(pos).ChildNodes.ElementAt(0);

            foreach (ParseTreeNode cuerpo in cuerpos.ChildNodes)
            {
                if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("METODO"))
                {
                    Procedimiento proc = guardarProcedimiento(cuerpo.ChildNodes[0]);
                    proc.llenarDeclaraciones(proc.sentencias, nueva.atributos);
                    nueva.agregarProcedimiento(proc);
                }
                else if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("__constructor"))
                {
                    Procedimiento cons = guardarConstructor(cuerpo);
                    cons.llenarDeclaraciones(cons.sentencias, nueva.atributos);
                    nueva.agregarConstructor(cons);
                }
                else if (cuerpo.ChildNodes.ElementAt(0).Term.Name.Equals("DECLARACION"))
                {
                    ParseTreeNode declara = cuerpo.ChildNodes[0];

                    /* DECLARACION -> TIPO + LISTA_IDS + asignarR
                     | TIPO + LISTA_IDS
                     | TIPO + NARREGLO -> id + INDICES */
                    int           tipo = Simbolo.getTipo(declara.ChildNodes[0].Token.Text);
                    ParseTreeNode ids  = declara.ChildNodes[1];
                    if (ids.Term.Name.Equals("NARREGLO"))
                    {
                        Atributo variable = new Atributo(ids.ChildNodes[0].Token.Text, tipo,
                                                         ids.ChildNodes[0].Token.Location.Line, ids.ChildNodes[0].Token.Location.Column);
                        variable.asignarArreglo(ids.ChildNodes[1]);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            variable.asignarClase(declara.ChildNodes[0].ChildNodes[0].Token.Text);
                        }
                        nueva.agregarAtributo(variable);
                    }
                    else
                    {
                        foreach (ParseTreeNode var in ids.ChildNodes)
                        {
                            Atributo a = new Atributo(var.Token.Text, tipo,
                                                      var.Token.Location.Line, var.Token.Location.Column);
                            if (declara.ChildNodes.Count == 3)
                            {
                                a.asignarValor(declara.ChildNodes[2]);
                            }
                            nueva.agregarAtributo(a);
                        }
                    }
                }
                else if (cuerpo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD"))
                {
                    int           vis     = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text);
                    ParseTreeNode declara = cuerpo.ChildNodes[1];
                    int           tipo    = Simbolo.getTipo(declara.ChildNodes[0].Token.Text);
                    ParseTreeNode ids     = declara.ChildNodes[1];
                    if (ids.Term.Name.Equals("NARREGLO"))
                    {
                        Atributo variable = new Atributo(ids.ChildNodes[0].Token.Text, tipo,
                                                         ids.ChildNodes[0].Token.Location.Line, ids.ChildNodes[0].Token.Location.Column);
                        variable.asignarArreglo(ids.ChildNodes[1]);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            variable.asignarClase(declara.ChildNodes[0].ChildNodes[0].Token.Text);
                        }
                        nueva.agregarAtributo(variable);
                    }
                    else
                    {
                        foreach (ParseTreeNode var in ids.ChildNodes)
                        {
                            Atributo a = new Atributo(var.Token.Text, tipo,
                                                      var.Token.Location.Line, var.Token.Location.Column);
                            if (declara.ChildNodes.Count == 3)
                            {
                                a.asignarValor(declara.ChildNodes[2]);
                            }
                            nueva.agregarAtributo(a);
                        }
                    }
                }
            }
            return(nueva);
        }
        public Clase guardarClase(ParseTreeNode nodo)
        {
            // CLASE -> id id CUERPOS
            //| id CUERPOS
            Clase nueva;
            int   idCuerpos = 1;

            if (nodo.ChildNodes.Count == 3)
            {
                // Tiene padre
                nueva = new Clase(nodo.ChildNodes[0].Token.Text,
                                  nodo.ChildNodes[1].Token.Text, nodo.ChildNodes[0].Token.Location.Line,
                                  nodo.ChildNodes[0].Token.Location.Column);
                idCuerpos = 2;
            }
            else
            {
                // No tiene padre
                nueva = new Clase(nodo.ChildNodes[0].Token.Text,
                                  nodo.ChildNodes[0].Token.Location.Line,
                                  nodo.ChildNodes[0].Token.Location.Column);
            }
            // Recorrer cuerpos
            foreach (ParseTreeNode cuerpo in nodo.ChildNodes[idCuerpos].ChildNodes)
            {
                // Recorrer cada uno de los cuerpos en busca de Declaraciones, Metodos, Funciones o Constructores

                /*
                 * CUERPO.Rule = VISIBILIDAD + TPROC + id + TCUERPO? -> 4 , 3
                 | TPROC + id + TCUERPO? -> 3 , 2
                 | sobreescribir + METODO -> 2
                 | PRINCIPAL -> 1
                 | VISIBILIDAD + CONSTRUCTOR -> 2
                 | CONSTRUCTOR -> 1
                 | ASIGNACION + fin; -> 1
                 */
                switch (cuerpo.ChildNodes.Count)
                {
                case 1:
                    // CONSTRUCTOR o PRINCIPAL
                    if (cuerpo.ChildNodes[0].Term.Name.Equals("CONSTRUCTOR"))
                    {
                        Procedimiento cons = guardarConstructor(cuerpo.ChildNodes[0],
                                                                (int)Simbolo.Visibilidad.PUBLICO);
                        cons.llenarDeclaraciones(cons.sentencias, nueva.atributos);
                        nueva.agregarConstructor(cons);
                    }
                    else if (cuerpo.ChildNodes[0].Term.Name.Equals("PRINCIPAL"))
                    {
                        Procedimiento proc = new Procedimiento("main",
                                                               (int)Simbolo.Tipo.VACIO, new List <Atributo>(), cuerpo.ChildNodes[0].ChildNodes[0],
                                                               cuerpo.Span.Location.Line, cuerpo.Span.Location.Column);
                        proc.llenarDeclaraciones(proc.sentencias, nueva.atributos);
                        nueva.agregarProcedimiento(proc);
                    }
                    break;

                case 2:
                    // sobreescribir METODO
                    // VISIBILIDAD CONSTRUCTOR
                    // TPROC id
                    if (cuerpo.ChildNodes[1].Term.Name.Equals("CONSTRUCTOR"))
                    {
                        int           vis  = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text);
                        Procedimiento cons = guardarConstructor(cuerpo.ChildNodes[1], vis);
                        cons.llenarDeclaraciones(cons.sentencias, nueva.atributos);
                        nueva.agregarConstructor(cons);
                    }
                    else if (cuerpo.ChildNodes[1].Term.Name.Equals("METODO"))
                    {
                        Procedimiento proc = guardarProcedimiento
                                                 (cuerpo.ChildNodes[1], true);
                        proc.llenarDeclaraciones(proc.sentencias, nueva.atributos);
                        nueva.agregarProcedimiento(proc);
                    }
                    else
                    {
                        // TPROC id
                        ParseTreeNode tproc = cuerpo.ChildNodes[0];
                        int           tipo  = Simbolo.getTipo(tproc.ChildNodes[0].Token.Text);
                        Atributo      a     = new Atributo(cuerpo.ChildNodes[1].Token.Text,
                                                           tipo, cuerpo.ChildNodes[1].Token.Location.Line,
                                                           cuerpo.ChildNodes[1].Token.Location.Column);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            a.asignarClase(tproc.ChildNodes[0].Token.Text);
                        }
                        nueva.agregarAtributo(a);
                    }
                    break;

                case 3:
                    // TPROC id CMETODO
                    // TPROC id DARREGLO
                    // TPROC id EXP
                    // VISIBILIDAD TPROC id
                    if (cuerpo.ChildNodes[0].Term.Name.Equals("TPROC"))
                    {
                        if (cuerpo.ChildNodes[2].Term.Name.Equals("CMETODO"))
                        {
                            // Es procedimiento
                            Procedimiento proc = guardarProcedimiento
                                                     (cuerpo, true);
                            proc.llenarDeclaraciones(proc.sentencias, nueva.atributos);
                            nueva.agregarProcedimiento(proc);
                        }
                        else
                        {
                            // Es atributo
                            ParseTreeNode tproc = cuerpo.ChildNodes[0];
                            String        ctipo = tproc.ChildNodes[0].Token.Text;
                            int           tipo  = Simbolo.getTipo(ctipo);
                            Atributo      a     = new Atributo(cuerpo.ChildNodes[1].Token.Text,
                                                               tipo, cuerpo.ChildNodes[1].Token.Location.Line,
                                                               cuerpo.ChildNodes[1].Token.Location.Column);
                            // Ver si el tipo de la variable es una clase
                            if (tipo == (int)Simbolo.Tipo.CLASE)
                            {
                                a.asignarClase(ctipo);
                            }
                            // Verificar si es un arreglo o tiene valor
                            if (cuerpo.ChildNodes[2].Term.Name.Equals("EXP"))
                            {
                                // Tiene valor
                                a.asignarValor(cuerpo.ChildNodes[2]);
                            }
                            else
                            {
                                // Es arreglo
                                ParseTreeNode darr = cuerpo.ChildNodes[2];
                                a.asignarArreglo(darr.ChildNodes[0]);
                                if (darr.ChildNodes.Count == 2)
                                {
                                    a.asignarValor(darr.ChildNodes[1]);
                                }
                            }
                            nueva.agregarAtributo(a);
                        }
                    }
                    else if (cuerpo.ChildNodes[0].Term.Name.Equals("VISIBILIDAD"))
                    {
                        // Es atributo
                        int           vis   = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text);
                        ParseTreeNode tproc = cuerpo.ChildNodes[1];
                        String        ctipo = tproc.ChildNodes[0].Token.Text;
                        int           tipo  = Simbolo.getTipo(ctipo);
                        Atributo      a     = new Atributo(cuerpo.ChildNodes[2].Token.Text,
                                                           tipo, vis, cuerpo.ChildNodes[2].Token.Location.Line,
                                                           cuerpo.ChildNodes[2].Token.Location.Column);
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            a.asignarClase(ctipo);
                        }
                        nueva.agregarAtributo(a);
                    }
                    break;

                case 4:
                    // VISIBILIDAD TPROC id CMETODO
                    // VISIBILIDAD TPROC id DARREGLO
                    // VISIBILIDAD TPROC id EXP
                    int vis2 = Simbolo.getVisibilidad(cuerpo.ChildNodes[0].ChildNodes[0].Token.Text);
                    if (cuerpo.ChildNodes[3].Term.Name.Equals("CMETODO"))
                    {
                        // Es procedimiento
                        Procedimiento proc = guardarProcedimiento(cuerpo, false);
                        proc.llenarDeclaraciones(proc.sentencias, nueva.atributos);
                        nueva.agregarProcedimiento(proc);
                    }
                    else
                    {
                        // Es atributo --> DARREGLO o EXP
                        // Es atributo
                        ParseTreeNode tproc = cuerpo.ChildNodes[1];
                        String        ctipo = tproc.ChildNodes[0].Token.Text;
                        int           tipo  = Simbolo.getTipo(ctipo);
                        Atributo      a     = new Atributo(cuerpo.ChildNodes[2].Token.Text,
                                                           tipo, vis2, cuerpo.ChildNodes[2].Token.Location.Line,
                                                           cuerpo.ChildNodes[2].Token.Location.Column);
                        // Ver si el tipo de la variable es una clase
                        if (tipo == (int)Simbolo.Tipo.CLASE)
                        {
                            a.asignarClase(ctipo);
                        }
                        // Verificar si es un arreglo o tiene valor
                        if (cuerpo.ChildNodes[3].Term.Name.Equals("EXP"))
                        {
                            // Tiene valor
                            a.asignarValor(cuerpo.ChildNodes[3]);
                        }
                        else
                        {
                            // Es arreglo
                            ParseTreeNode darr = cuerpo.ChildNodes[3];
                            a.asignarArreglo(darr.ChildNodes[0]);
                            if (darr.ChildNodes.Count == 2)
                            {
                                a.asignarValor(darr.ChildNodes[1]);
                            }
                        }
                        nueva.agregarAtributo(a);
                    }
                    break;
                }
            }
            return(nueva);
        }
        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);
        }
        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);
        }
示例#24
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);
        }
        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);
        }
        private static void generarC3DSuper(Clase clase, String puntero, String estructura)
        {
            Simbolo sclase = TablaSimbolos.getInstance.getClase(clase.nombre);

            if (sclase != null)
            {
                String t1 = getTemporal();
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar apuntador del super"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, t1, puntero, "+", "1"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar posicion donde empieza super"));
                instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, estructura, t1, "H"));
                // Buscar clase padre
                Clase padre;
                if (clase.padre != null)
                {
                    padre = getClasePadre(clase.padre);
                    if (padre == null)
                    {
                        return;
                    }
                }
                else
                {
                    return;
                }
                sclase = TablaSimbolos.getInstance.getClase(clase.padre);
                if (sclase == null)
                {
                    return;
                }
                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Reservar espacio para la clase padre" + sclase.nombre));
                aumentarHeap(Convert.ToString(sclase.tam));
                // Recorrer las variables globales y asignarles
                foreach (Atributo atr in padre.atributos)
                {
                    if (atr.visibilidad == (int)Simbolo.Visibilidad.PUBLICO ||
                        atr.visibilidad == (int)Simbolo.Visibilidad.PROTEGIDO)
                    {
                        if (atr.esArreglo)
                        {
                            Arreglo.guardarC3D(atr.nombre, atr.valor, Acceso.Tipo.SUPER);
                        }
                        else
                        {
                            if (atr.valor != null)
                            {
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor del atributo " + atr.nombre));
                                Nodo exp = Expresion.expresionC3D(atr.valor);
                                Acceso.actual = null;
                                instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion del atributo " + atr.nombre));
                                Nodo nodo = Acceso.generarC3DID(atr.nombre, Acceso.Tipo.SUPER,
                                                                "P", "Stack");
                                if (nodo != null)
                                {
                                    // Asignar la expresion
                                    instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar valor del atributo " + atr.nombre));
                                    instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR,
                                                              nodo.estructura, nodo.referencia, exp.cadena));
                                }
                            }
                        }
                    }
                }
            }
        }
        public static Nodo generarMultiplicarC3D(ParseTreeNode izq, ParseTreeNode der)
        {
            Nodo nodo = new Nodo();
            Nodo nizq = Expresion.expresionC3D(izq);
            Nodo nder = Expresion.expresionC3D(der);

            if (nizq == null || nder == null)
            {
                return(null);
            }
            if (nizq.tipo == (int)Simbolo.Tipo.VACIO)
            {
                //Error: NullPointerException
            }
            if (nder.tipo == (int)Simbolo.Tipo.VACIO)
            {
                //Error: NullPointerException
            }
            nodo.cadena = GeneradorC3D.getTemporal();
            nodo.tipo   = (int)Simbolo.Tipo.NUMERO;
            switch (nizq.tipo)
            {
            case (int)Simbolo.Tipo.NUMERO:
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER ||
                    nder.tipo == (int)Simbolo.Tipo.BOOLEAN ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, num * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                break;

            case (int)Simbolo.Tipo.DECIMAL:
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.CARACTER ||
                    nder.tipo == (int)Simbolo.Tipo.BOOLEAN ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, decimal * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    return(nodo);
                }
                break;

            case (int)Simbolo.Tipo.BOOLEAN:
                // bool - num
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Multiplicar dos temporales, bool * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                else if (nder.tipo == (int)Simbolo.Tipo.BOOLEAN)
                {
                    return(Logica.generarC3D(izq, "&&", der));
                }
                break;

            case (int)Simbolo.Tipo.CARACTER:
                // bool - num
                if (nder.tipo == (int)Simbolo.Tipo.NUMERO ||
                    nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                {
                    String temp = GeneradorC3D.getTemporal();
                    // temp = nizq.cad operador nder.der
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Restar dos temporales, caracter * num"));
                    GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp, nizq.cadena, "*", nder.cadena));
                    nodo.cadena = temp;
                    nodo.tipo   = nizq.tipo;
                    if (nder.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = nder.tipo;
                    }
                    return(nodo);
                }
                break;
            }
            //Error semantico!
            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                  "No se puede multiplicar " + Simbolo.getValor(nizq.tipo) + " con " + Simbolo.getValor(nder.tipo) + ".",
                                                  izq.Span.Location.Line, izq.Span.Location.Column));
            return(null);
        }
        public static Nodo 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);
            }
        }
示例#29
0
        /* //ARREGLOS!
         * public Nodo guardarArregloC3D(Simbolo arr, ParseTreeNode indices, String eError)
         * {
         *   // INDICES -> INDICES INDICE
         *   //          | INDICE
         *   Nodo nuevo = new Nodo();
         *   if (indices.ChildNodes.Count == 2)
         *   {
         *       Nodo indiceE = guardarArregloC3D(arr, indices.ChildNodes.ElementAt(0), eError);
         *       Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(1), eError, indiceE.externa);
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// " + indiceE.externa.ToString() + " dimension externa!"));
         *       String tam = tablaSimbolos.getTamanio(arr, indiceE.externa, dimInterna.interna).ToString();
         *       String temp1 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, dimInterna.cadena, "*", tam));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indiceE.cadena, "+", temp1));
         *       nuevo.externa = indiceE.externa + 1;
         *   }
         *   else
         *   {
         *       Nodo dimInterna = getInternasC3D(arr, indices.ChildNodes.ElementAt(0), eError, 1);
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// 1 dimension externa!"));
         *       nuevo.cadena = getTemporal();
         *       String tam = tablaSimbolos.getTamanio(arr, 1, dimInterna.interna).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, dimInterna.cadena, "*", tam));
         *       nuevo.externa = 2;
         *   }
         *   return nuevo;
         * }
         *
         * public Nodo getInternasC3D(Simbolo arr, ParseTreeNode indice, String eError, int externa)
         * {
         *   // INDICE -> INDICE EXP
         *   //         | EXP
         *   Nodo nuevo = new Nodo();
         *   if (indice.ChildNodes.Count == 2)
         *   {
         *       Nodo indice1 = getInternasC3D(arr, indice.ChildNodes.ElementAt(0), eError, externa);
         *       Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(1));
         *       String inf = tablaSimbolos.getIndiceInferior(arr, externa, indice1.interna).ToString();
         *       String sup = tablaSimbolos.getIndiceSuperior(arr, externa, indice1.interna).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede"));
         *       String temp1 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, exp.cadena, "-", inf));
         *       String tam = tablaSimbolos.getTamanio(arr, externa, indice1.interna).ToString();
         *       String temp2 = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, temp2, temp1, "*", tam));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, indice1.cadena, "+", temp2));
         *       nuevo.interna = indice1.interna + 1;
         *   }
         *   else
         *   {
         *       //ext -> 1, int -> 1
         *       Nodo exp = expresionC3D(indice.ChildNodes.ElementAt(0));
         *       String inf = tablaSimbolos.getIndiceInferior(arr, externa, 1).ToString();
         *       String sup = tablaSimbolos.getIndiceSuperior(arr, externa, 1).ToString();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el indice inferior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, "<", inf));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Comparar si es menor que el superior"));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, exp.cadena, ">=", sup));
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// El indice esta correcto, se procede"));
         *       nuevo.cadena = getTemporal();
         *       instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, nuevo.cadena, exp.cadena, "-", inf));
         *       nuevo.interna = 2;
         *   }
         *   return nuevo;
         * }
         *
         * //ID!
         * public Nodo getIDC3D(ParseTreeNode nodo)
         * {
         *   Nodo nuevo = new Nodo();
         *   nuevo.pila = "Stack";
         *   Simbolo objeto = tablaSimbolos.buscarVariable(nodo.ChildNodes.ElementAt(0).
         *                           Token.Value.ToString(), nombreMetodo);
         *   if (objeto == null)
         *   {
         *       objeto = tablaSimbolos.buscarGlobal(nodo.ChildNodes.ElementAt(0).Token.Value.ToString());
         *       if (objeto == null)
         *       {
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *               " no ha sido declarada!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *           return null;
         *       }
         *   }
         *   nuevo.tipo = objeto.tipo;
         *
         *   String eError = getEtiqueta();
         *   String eSalida = getEtiqueta();
         *   ParseTreeNode acceso = nodo.ChildNodes.ElementAt(1);
         *   // Generacion de codigo de referencia y valor...
         *   String temp1 = getTemporal();
         *   nuevo.posicion = temp1;
         *   if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL)
         *   {
         *       nuevo.referencia = "error";
         *   }
         *   else
         *   {
         *       if (objeto.dimensiones != null)
         *       {
         *           //ES ARREGLO!
         *       }
         *       else
         *       {
         *           if (objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *           {
         *               nuevo.referencia = temp1;
         *           }
         *           else
         *           {
         *               nuevo.referencia = "error";
         *           }
         *       }
         *   }
         *   String val = "P";
         *   if (objeto.ambito == (int)Simbolo.Tipo.GLOBAL)
         *   {
         *       val = "0";
         *   }
         *   instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar posicion en pila o heap (global) de " + objeto.nombre));
         *   C3D ins1 = new C3D((int)C3D.TipoC3D.ASIGNACION, temp1, val, "+", objeto.pos.ToString());
         *   instrucciones.Add(ins1);
         *   Simbolo ter1 = new Simbolo();
         *   ter1.tipo = (int)Simbolo.Tipo.ETIQUETA;
         *   ter1.nombre = temp1;
         *   ter1.padre = nombreMetodo;
         *   ter1.instruccion = ins1;
         *   nuevo.cadena = getTemporal();
         *   instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Buscar valor de " + objeto.nombre));
         *   C3D ins2 = new C3D((int)C3D.TipoC3D.ACCESO, nuevo.pila, nuevo.cadena, temp1);
         *   instrucciones.Add(ins2);
         *   Simbolo ter2 = new Simbolo();
         *   ter2.tipo = (int)Simbolo.Tipo.ETIQUETA;
         *   ter2.nombre = nuevo.cadena;
         *   ter2.padre = nombreMetodo;
         *   ter2.instruccion = ins2;
         *   if (enRetorno && !esParametro)
         *   {
         *       tablaSimbolos.Add(ter1);
         *       tablaSimbolos.Add(ter2);
         *   }
         *   if (acceso.ChildNodes.Count > 0)
         *   {
         *       // SE HACE EL ACCESO!
         *       if (objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *       {
         *           nuevo.padre = objeto.estructura;
         *           nuevo = getAccesoC3D(nuevo, acceso, eError);
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Salto a salida"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, eSalida));
         *           generarEtiquetas((eError));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// NullPointerException"));
         *           String taux = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "102"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, "0"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.EXIT, "exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de exit"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           generarEtiquetas((eSalida));
         *       }
         *       else
         *       {
         *           //Error!
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "El objeto " + objeto.nombre + " no es una estructura, no se puede acceder!",
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *               nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *           return null;
         *       }
         *   }
         *   return nuevo;
         * }
         *
         * //ACCESO!
         * public Nodo getAccesoC3D(Nodo objeto, ParseTreeNode accesos, String eError)
         * {
         *   // ID (ACCESO -> .ID.ID.ID...)
         *   // En objeto trae el valor en cadena y en padre trae el nombre del objeto a accesar
         *
         *   foreach (ParseTreeNode acceso in accesos.ChildNodes)
         *   {
         *       int tipo = objeto.tipo;
         *       String padre = objeto.padre;
         *       if (tipo == (int)Simbolo.Tipo.ESTRUCTURA)
         *       {
         *           Simbolo atributo = tablaSimbolos.buscarAtributo(acceso.Token.Value.ToString(), padre);
         *           if (atributo == null)
         *           {
         *               Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                   "El atributo " + acceso.Token.Value.ToString() +
         *                   " no existe en " + objeto.padre + "!", acceso.Token.Location.Line,
         *                   acceso.Token.Location.Column));
         *               return null;
         *           }
         *           objeto.tipo = atributo.tipo;
         *           objeto.padre = atributo.estructura;
         *           // Realizar C3D
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Verificar que no sea NULL"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, eError, objeto.cadena, "==", "-201314863.102494"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener posicion de " + atributo.nombre));
         *           objeto.referencia = getTemporal();
         *           objeto.posicion = objeto.referencia;
         *           objeto.pila = "Heap";
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, objeto.referencia, objeto.cadena, "+", atributo.pos.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Obtener valor de " + atributo.nombre));
         *           objeto.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Heap", objeto.cadena, objeto.referencia));
         *           if (!(objeto.tipo == (int)Simbolo.Tipo.CADENA || objeto.tipo == (int)Simbolo.Tipo.ESTRUCTURA))
         *           {
         *               objeto.referencia = "error";
         *           }
         *       }
         *       else
         *       {
         *           //Error! No se puede acceder algo que no sea una estructura!
         *           Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *               "El atributo " + padre + " no es una estructura, no se puede acceder!",
         *               acceso.Token.Location.Line,
         *               acceso.Token.Location.Column));
         *           return null;
         *       }
         *
         *   }
         *   return objeto;
         * }
         *
         * // NATIVAS
         * public Nodo generarC3DNativas(ParseTreeNode nodo)
         * {
         *   Nodo retorno = new Nodo();
         *   switch (nodo.ChildNodes.ElementAt(0).Term.Name)
         *   {
         *       case "inNum":
         *           Nodo expN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           Nodo expN2 = expresionC3D(nodo.ChildNodes.ElementAt(2));
         *           if (expN1 == null || expN2 == null)
         *           {
         *               return null;
         *           }
         *           String taux = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, taux, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1, taux, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1, expN1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, num"));
         *           String tpar2 = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2, taux, "+", "2"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2, expN2.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tpos = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpos, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tpos));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de inNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getBool":
         *           Nodo expB1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           if (expB1 == null)
         *           {
         *               return null;
         *           }
         *           String tauxB = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxB, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1B = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1B, tauxB, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1B, expB1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.BOOLEAN;
         *           String tposB = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposB, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposB));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getBool"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getNum":
         *           Nodo expgN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *           Nodo expgN2 = expresionC3D(nodo.ChildNodes.ElementAt(2));
         *           Nodo expgN3 = expresionC3D(nodo.ChildNodes.ElementAt(3));
         *           if (expgN1 == null || expgN2 == null || expgN3 == null)
         *           {
         *               return null;
         *           }
         *           String tauxg = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxg, "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *           String tpar1g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1g, tauxg, "+", "1"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1g, expgN1.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del segundo parametro, referencia"));
         *           String tpar2g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar2g, tauxg, "+", "2"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar2g, expgN2.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del tercer parametro, num"));
         *           String tpar3g = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar3g, tauxg, "+", "3"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar3g, expgN3.cadena));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tposg = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposg, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposg));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getNum"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *       case "getLength":
         *           if (nodo.ChildNodes.Count == 2)
         *           {
         *               //getLength
         *               Nodo expLN1 = expresionC3D(nodo.ChildNodes.ElementAt(1));
         *               if (expLN1 == null)
         *               {
         *                   return null;
         *               }
         *               String tauxl = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Apuntar al proximo ambito"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tauxl, "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Envio del primer parametro, referencia"));
         *               String tpar1l = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tpar1l, tauxl, "+", "1"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.VALOR, "Stack", tpar1l, expLN1.cadena));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *               retorno.referencia = "error";
         *               retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *               String tposl = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposl, "P", "+", "0"));
         *               retorno.cadena = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposl));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getStrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *
         *           }
         *           else
         *           {
         *               //getLengthArreglo   -> id num
         *               String id = nodo.ChildNodes.ElementAt(1).Token.Value.ToString();
         *               Simbolo arreglo = tablaSimbolos.buscarVariable(id, nombreMetodo);
         *               if (arreglo == null)
         *               {
         *                   arreglo = tablaSimbolos.buscarGlobal(id);
         *                   if (arreglo == null)
         *                   {
         *                       Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                           "El arreglo " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *                           " no ha sido declarado!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *                           nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *                       return null;
         *                   }
         *               }
         *               if (arreglo.dims == -1)
         *               {
         *                   Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
         *                       "La variable " + nodo.ChildNodes.ElementAt(0).Token.Value.ToString() +
         *                       " no es de tipo areglo!", nodo.ChildNodes.ElementAt(0).Token.Location.Line,
         *                       nodo.ChildNodes.ElementAt(0).Token.Location.Column));
         *                   return null;
         *               }
         *               int dimension = Convert.ToInt32(nodo.ChildNodes.ElementAt(2).Token.Value.ToString());
         *               int tam = tablaSimbolos.getTamanio(arreglo, dimension);
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *               retorno.referencia = "error";
         *               retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *               retorno.cadena = getTemporal();
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, retorno.cadena, tam.ToString(), "", ""));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getArrLength"));
         *               instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           }
         *           break;
         *       default:
         *           // getRandom
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Aumentar ambito de getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "+", tamMetodo.ToString()));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.NATIVA, "$$_getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Guardar el retorno"));
         *           retorno.referencia = "error";
         *           retorno.tipo = (int)Simbolo.Tipo.NUMERO;
         *           String tposr = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, tposr, "P", "+", "0"));
         *           retorno.cadena = getTemporal();
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ACCESO, "Stack", retorno.cadena, tposr));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Disminuir ambito de getRandom"));
         *           instrucciones.Add(new C3D((int)C3D.TipoC3D.ASIGNACION, "P", "P", "-", tamMetodo.ToString()));
         *           break;
         *   }
         *
         *   return retorno;
         * }
         */

        //CASTEO DE EXPRESIONES!
        public static Nodo castearC3D(int tipo, Nodo nodo, int f, int c)
        {
            if (nodo == null)
            {
                return(null);
            }
            if (nodo.tipo == (int)Simbolo.Tipo.BOOLEAN)
            {
                if (nodo.etqFalsa == null && nodo.etqVerdadera == null)
                {
                    nodo.tipo = (int)Simbolo.Tipo.NUMERO;
                }
            }
            if (nodo.tipo == tipo)
            {
                return(nodo);
            }
            else
            {
                Nodo nuevo = new Nodo();
                switch (tipo)
                {
                case (int)Simbolo.Tipo.NUMERO:
                    if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a entero", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a entero", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.CARACTER:
                    if (nodo.tipo == (int)Simbolo.Tipo.NUMERO || nodo.tipo == (int)Simbolo.Tipo.DECIMAL)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a caracter", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a caracter", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.DECIMAL:
                    if (nodo.tipo == (int)Simbolo.Tipo.CARACTER || nodo.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        nodo.tipo = tipo;
                        return(nodo);
                    }
                    else
                    {
                        // CADENA o BOOLEAN
                        if (nodo.tipo == (int)Simbolo.Tipo.CADENA)
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente cadena a decimal", f, c));
                        }
                        else
                        {
                            Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                                  "No se puede castear implicitamente booleano a decimal", f, c));
                        }
                        return(null);
                    }

                case (int)Simbolo.Tipo.BOOLEAN:
                    // BOOLEAN
                    if (nodo.tipo == (int)Simbolo.Tipo.NUMERO)
                    {
                        nuevo.tipo         = tipo;
                        nuevo.etqVerdadera = GeneradorC3D.getEtiqueta();
                        nuevo.etqFalsa     = GeneradorC3D.getEtiqueta();
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.COMENTARIO, "// Castear num a bool"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.CONDICIONAL, nuevo.etqFalsa, nodo.cadena, "==", "0"));
                        GeneradorC3D.instrucciones.Add(new C3D((int)C3D.TipoC3D.INCONDICIONAL, nuevo.etqVerdadera));
                        return(nuevo);
                    }
                    else
                    {
                        Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                              "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a bool", f, c));
                        return(null);
                    }

                default:
                    // CADENA
                    Errores.getInstance.agregar(new Error((int)Error.tipoError.SEMANTICO,
                                                          "No se puede castear implicitamente " + Simbolo.getValor(nodo.tipo) + " a cadena", f, c));
                    return(null);
                }
            }
        }