public Procedimiento guardarProcedimiento(ParseTreeNode nodo, bool sobrescribir)
        {
            // VISIBILIDAD TPROC id CMETODO
            // TPROC id CMETODO
            /*** CMETODO -> PARAMETROS SENTENCIAS ***/
            Procedimiento nuevo;
            int           vis    = (int)Simbolo.Visibilidad.PUBLICO;
            int           inicio = 0;

            if (nodo.ChildNodes.Count == 4)
            {
                vis = Simbolo.getVisibilidad(nodo.ChildNodes[inicio].ChildNodes[0].Token.Text);
                inicio++;
            }
            ParseTreeNode   tproc      = nodo.ChildNodes[inicio];
            String          id         = nodo.ChildNodes[inicio + 1].Token.Text;
            ParseTreeNode   cmetodo    = nodo.ChildNodes[inicio + 2];
            int             tipo       = Simbolo.getTipo(tproc.ChildNodes[0].Token.Text);
            List <Atributo> parametros = guardarParametros(cmetodo.ChildNodes[0]);

            nuevo = new Procedimiento(id, tipo, vis, parametros, cmetodo.ChildNodes[1], sobrescribir,
                                      nodo.ChildNodes[inicio + 1].Token.Location.Line,
                                      nodo.ChildNodes[inicio + 1].Token.Location.Column);
            if (tproc.ChildNodes[1].ChildNodes.Count > 0)
            {
                nuevo.agregarArreglo(tproc.ChildNodes[1]);
            }
            return(nuevo);
        }
Ejemplo n.º 2
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));
                }
            }
        }