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); } } }
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); }
public funcion extraer_funcion() { funcion ret = funcion_actual; pila_funciones.Pop(); funcion_actual = pila_funciones.Peek(); return(ret); }
public void set_principal() { principal = funcion_actual; pila_funciones.Pop(); funcion_actual = pila_funciones.Peek(); //QUITAR ESTO DESPUES //@const.dibujar_funcion(principal); }
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); }
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); } }
public void pop_funcion() { funciones.Add(funcion_actual); pila_funciones.Pop(); funcion_actual = pila_funciones.Peek(); }
//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); }
public void set_global() { global = funcion_actual; pila_funciones.Pop(); }
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)); } }
public static void ejecutar_gobal(funcion funcion) { @const.global = true; ejecutar_flujo(funcion, null); @const.global = false; }
public void funcion_nueva(String nombre, funcion padre, String tipo) { actual.nueva_funcion(nombre, padre, tipo); }
public camino(nodo_expresion raiz, funcion funcion) { this.condicion = new arbol_expresion(); this.condicion.raiz = raiz; this.funcion = funcion; }
public funcion(String nombre, funcion padre, String tipo) { this.nombre = nombre; this.padre = padre; this.tipo = tipo; }