Beispiel #1
0
 public void show_funcion(funcion funcion)
 {
     Console.WriteLine(funcion.nombre);
     Console.WriteLine("Parametros: ");
     foreach (String parametro in funcion.parametros)
     {
         Console.WriteLine(parametro);
     }
     Console.WriteLine("Sentencias: ");
     foreach (sentencia s in funcion.sentencias)
     {
         String tipo = s.tipo;
         if (tipo.Equals("declarar") || tipo.Equals("asignacion"))
         {
             String ids = "";
             foreach (String id in s.ids)
             {
                 ids += id + ",";
             }
             if (ids.Length > 0)
             {
                 ids = ids.Substring(0, ids.Length - 1);
             }
             String asigna = "";
             if (s.expresion.raiz != null)
             {
                 asigna = "= expresion";
             }
             String cadena = tipo + " " + ids + " " + asigna;
             Console.WriteLine(cadena);
         }
     }
 }
Beispiel #2
0
        public static nodo_expresion ejecutar_sentencia_control(funcion funcion)
        {
            variables variables = new variables();

            variables_actuales.Push(variables);
            funcion_actual.Push(funcion);
            foreach (sentencia s in funcion.sentencias)
            {
                nodo_expresion respuesta = ejecutar_sentencia(s);
                if (respuesta.rol.Equals("retorno"))
                {
                    variables_actuales.Pop();
                    funcion_actual.Pop();
                    return(respuesta);
                }
                else if (respuesta.rol.Equals("detener"))
                {
                    variables_actuales.Pop();
                    funcion_actual.Pop();
                    return(respuesta);
                }
                else if (respuesta.rol.Equals("continuar"))
                {
                    variables_actuales.Pop();
                    funcion_actual.Pop();
                    return(respuesta);
                }
            }
            variables_actuales.Pop();
            funcion_actual.Pop();
            return(@const.VOID);
        }
Beispiel #3
0
        public funcion extraer_funcion()
        {
            funcion ret = funcion_actual;

            pila_funciones.Pop();
            funcion_actual = pila_funciones.Peek();
            return(ret);
        }
Beispiel #4
0
        public void set_principal()
        {
            principal = funcion_actual;
            pila_funciones.Pop();
            funcion_actual = pila_funciones.Peek();


            //QUITAR ESTO DESPUES
            //@const.dibujar_funcion(principal);
        }
Beispiel #5
0
        private static nodo_expresion selecciona(sentencia sentencia)
        {
            Boolean entro = false;

            foreach (camino camino in sentencia.caminos)
            {
                String condicion = "";
                if (camino.condicion.raiz != null)
                {
                    condicion = camino.condicion.ejecutar_arbol().valor;
                }
                else
                {
                    condicion = "1";
                }
                funcion flujo = camino.funcion;
                if (condicion.Equals("1") || entro == true)
                {
                    entro = true;
                    nodo_expresion respuesta = ejecutar_sentencia_control(flujo);
                    if (respuesta.rol.Equals("detener"))
                    {
                        break;
                    }
                    else if (respuesta.rol.Equals("retorno"))
                    {
                        return(respuesta);
                    }
                    else if (respuesta.rol.Equals("continuar"))
                    {
                        return(respuesta);
                    }
                }
            }

            return(@const.VOID);
        }
Beispiel #6
0
        private static nodo_expresion si(sentencia sentencia)
        {
            nodo_expresion si_cond = sentencia.caminos.ElementAt(0).condicion.ejecutar_arbol();
            funcion        si      = sentencia.caminos.ElementAt(0).funcion;
            funcion        sino    = null;

            if (sentencia.caminos.Count > 1)
            {
                sino = sentencia.caminos.ElementAt(1).funcion;
            }

            if (si_cond.valor.Equals("1"))
            {
                return(ejecutar_sentencia_control(si));
            }
            else if (sino != null)
            {
                return(ejecutar_sentencia_control(sino));
            }
            else
            {
                return(@const.VOID);
            }
        }
Beispiel #7
0
 public void pop_funcion()
 {
     funciones.Add(funcion_actual);
     pila_funciones.Pop();
     funcion_actual = pila_funciones.Peek();
 }
Beispiel #8
0
 //OPERACIONES SOBRE FUNCIONES
 public void nueva_funcion(String nombre, funcion padre, String tipo)
 {
     funcion_actual = new funcion(nombre, padre, tipo);
     pila_funciones.Push(funcion_actual);
 }
Beispiel #9
0
 public void set_global()
 {
     global = funcion_actual;
     pila_funciones.Pop();
 }
Beispiel #10
0
        public static nodo_expresion ejecutar_flujo(funcion funcion, List <arbol_expresion> parametros)
        {
            variables variables = new variables();

            variables_actuales.Push(variables);
            funcion_actual.Push(funcion);

            //DECLARAR PARAMETROS AUN NO HECHA
            int indice = 0;

            foreach (String parametro in funcion.parametros)
            {
                String tipo = parametro.Split(',')[0].ToLower();
                String id   = parametro.Split(',')[1];

                //nodo_expresion valor = parametros.ElementAt(indice).ejecutar_arbol();
                nodo_expresion valor = parametros.ElementAt(indice).ejecutar_arbol();
                if (valor.tipo.Equals("error"))
                {
                    return(new nodo_expresion("Error Semantico", "Parametro incorrecto", "error", -1, -1));
                }
                else
                {
                    variables_actuales.Peek().add_variable(tipo, id, valor.valor);
                }
                indice++;
            }

            foreach (sentencia s in funcion.sentencias)
            {
                nodo_expresion respuesta = ejecutar_sentencia(s);
                if (respuesta.rol.Equals("retorno"))
                {
                    if (respuesta.tipo.Equals(funcion.tipo.ToLower()))
                    {
                        variables_actuales.Pop();
                        funcion_actual.Pop();
                        return(respuesta);
                    }
                    else
                    {
                        errores.errores.add_error("Error Semantico", "Error en retorno de tipo " + respuesta.tipo + " en funcion \"" + funcion.nombre.Split('#')[0] + "\" de tipo " + funcion.tipo, s.fila, s.columna);
                        variables_actuales.Pop();
                        funcion_actual.Pop();
                        return(new nodo_expresion("error", "error", "error", s.fila, s.columna));
                    }
                }
                else if (respuesta.rol.Equals("continuar") || respuesta.rol.Equals("detener"))
                {
                    errores.errores.add_error("Error Semantico", "Sentencia " + respuesta.rol + " fuera de ciclo, en funcion \"" + funcion.nombre.Split('#')[0] + "\" de tipo " + funcion.tipo, s.fila, s.columna);
                    variables_actuales.Pop();
                    funcion_actual.Pop();
                    return(new nodo_expresion("error", "error", "error", s.fila, s.columna));
                }
            }

            //reporte de variables
            //foreach (variable variable in variables_actuales.Peek().lista) {
            //    Console.WriteLine(variable.tipo + " " + variable.nombre + " " + variable.valor);
            //}
            if ([email protected])
            {
                variables_actuales.Pop();
            }
            else
            {
                funcion.variables = variables_actuales.Pop();
            }
            funcion_actual.Pop();


            if ("void".Equals(funcion.tipo.ToLower()))
            {
                return(@const.VOID);
            }
            else
            {
                errores.errores.add_error("Error Semantico", "Error en retorno de tipo " + "void" + " en funcion \"" + funcion.nombre.Split('#')[0] + "\" de tipo " + funcion.tipo, funcion.sentencias.Last().fila, funcion.sentencias.Last().columna);
                return(new nodo_expresion("error", "error", "error", funcion.sentencias.Last().fila, funcion.sentencias.Last().columna));
            }
        }
Beispiel #11
0
 public static void ejecutar_gobal(funcion funcion)
 {
     @const.global = true;
     ejecutar_flujo(funcion, null);
     @const.global = false;
 }
Beispiel #12
0
 public void funcion_nueva(String nombre, funcion padre, String tipo)
 {
     actual.nueva_funcion(nombre, padre, tipo);
 }
Beispiel #13
0
 public camino(nodo_expresion raiz, funcion funcion)
 {
     this.condicion      = new arbol_expresion();
     this.condicion.raiz = raiz;
     this.funcion        = funcion;
 }
Beispiel #14
0
 public funcion(String nombre, funcion padre, String tipo)
 {
     this.nombre = nombre;
     this.padre  = padre;
     this.tipo   = tipo;
 }