public Ejecutar(EjecutarSBS inicio) { Inicio = inicio; if (TitusNotifiaciones.ContarErrores() == 0) { BuscarErroresGlobal(Inicio); if (TitusNotifiaciones.ContarErrores() == 0) { TablaVariables.Tabla.Add(new Variables());//asignamos el espacio para el principal LlenarGlobal(); } if (TitusNotifiaciones.ContarErrores() == 0) { LlenarIncluyes(Inicio); } if (TitusNotifiaciones.ContarErrores() == 0) { EjecutarPrincipal(); } if (TitusNotifiaciones.ContarErrores() == 0) { TitusNotifiaciones.MostrarImagen(); } } if (TitusNotifiaciones.ContarErrores() > 0) { MessageBox.Show("Se encontraron error, favor revisar las notifiaciones", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { MessageBox.Show("Ejecucion realizada con exito.", "Exito", MessageBoxButtons.OK, MessageBoxIcon.Information); } }
public static Variables BuscarMetodo(String nombre, FLlamada lista) { int cont = TablaVariables.Tabla.Count - 1; bool encontrado = false; Variables variable = null; while (cont >= 0 && TitusNotifiaciones.ContarErrores() == 0 && !encontrado) { if (TablaVariables.Tabla[cont].Nombre == nombre && TablaVariables.Tabla[cont].Rol == Constante.TMetodo) { FFuncion funcion = (FFuncion)Tabla[cont].Valor; if (funcion.Parametros.Count == lista.Parametros.Count) { int i = 0; Boolean estado = true; while (i < funcion.Parametros.Count && estado) { NodoExpresion exp = (NodoExpresion)lista.Parametros[i].ResolverExpresion(Constante.DefaultDefineNumber, funcion.RutaArchivo); if (!(exp.Tipo == funcion.Parametros[i].Tipo)) { estado = false; } i++; } if (estado == true) { encontrado = !encontrado; variable = TablaVariables.Tabla[cont]; } } } cont--; } return(variable); }
private String DibujarAST(int linea, int columna) { String cadena = ""; List <Variables> lista = TablaVariables.BuscarMetodo(Id); if (lista.Count > 0) { foreach (Variables metodo in lista) { int i = 0; int actual = i; cadena = "digraph G{\n\tgraph[rankir = \"LR\"];\n\tnode[shape = box, fontsize = 16, fontname = \"Arial\", style = filled, fillcolor = grey88];\n\t"; cadena = cadena + "\t\tnodo" + actual.ToString() + "[label=\"" + metodo.Tipo + ": " + metodo.Nombre + "("; FFuncion parametros = (FFuncion)metodo.Valor; String aux = ""; String para = ""; foreach (Simbolo p in parametros.Parametros) { para = aux + p.Tipo; aux = para + ", "; } cadena = cadena + para + ")\"]\n"; if (metodo.Ambito != null) { foreach (Simbolo simbolo in metodo.Ambito.TablaSimbolo) { i++; int actualambito = i; cadena = cadena + GenerarArbolGraphics(ref i, simbolo); cadena = cadena + "\t\tnodo" + actual.ToString() + "->nodo" + actualambito.ToString() + "\n"; } } cadena = cadena + "\n}"; try { String ruta = RutaImagen + "\\"; String rutatxt = ruta + "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".txt"; String rutaimg = ruta + "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".png"; String nombreimg = "AST_" + metodo.Nombre + "_" + (TitusNotifiaciones.ListaImagenes.Images.Count + 1).ToString() + ".png"; /*if (File.Exists(rutaimg)) * { * File.Delete(rutaimg); * }*/ File.WriteAllText(rutatxt, cadena); ProcessStartInfo startInfo = new ProcessStartInfo("dot.exe"); startInfo.Arguments = "-Tjpg " + @rutatxt + " -o " + @rutaimg; Process.Start(startInfo); System.Threading.Thread.Sleep(3000); TitusNotifiaciones.MeterImagen(nombreimg, rutaimg); } catch { } } } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "No se encontro ningun metodo con el nombre " + Id, RutaArchivo, linea.ToString(), columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } return(cadena); }
public void EjecutarAsignacion(Simbolo global) { FExpresion expresion = (FExpresion)global.Objeto; if (expresion != null) { NodoExpresion valor = expresion.ResolverExpresion(expresion.Incerteza, expresion.RutaArchivo); Variables aux = TablaVariables.BuscarVariable(global.Nombre); if (TitusNotifiaciones.ContarErrores() == 0) { if (aux != null) { if (aux.Tipo == Constante.TString) { if (valor.Tipo == Constante.TString || valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; aux.Valor = new NodoExpresion(valor); } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } else if (aux.Tipo == Constante.TNumber) { if (valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; aux.Valor = new NodoExpresion(valor); } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } else if (aux.Tipo == Constante.TBool) { if (valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; aux.Valor = new NodoExpresion(valor); } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "No se puede asignar una variable de tipo " + global.Tipo + " un valor " + valor.Tipo, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "Variable no declarada: " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } } }
public void EjecutarSelecciona(Simbolo selecciona) { FSelecciona fselecciona = (FSelecciona)selecciona.Objeto; NodoExpresion condicion = fselecciona.Expresion.ResolverExpresion(fselecciona.Incerteza, fselecciona.RutaArchivo); if (TitusNotifiaciones.ContarErrores() == 0) { int cont = 0; int posencontrado = -1; Boolean encontrado = false; while (cont < fselecciona.Casos.Count && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno() && TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsRetorno()) { if (fselecciona.Casos[cont].Tipo == condicion.Tipo) { if (!encontrado) { if (fselecciona.Casos[cont].Tipo == Constante.TNumber) { if (fselecciona.Casos[cont].ValNumero == condicion.Numero) { EjecutarCaso(fselecciona.Casos[cont]); encontrado = true; posencontrado = cont; SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo); } } else { if (fselecciona.Casos[cont].ValCadena == condicion.Cadena) { EjecutarCaso(fselecciona.Casos[cont]); SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo); } } } //seguimos ejcutando si no hay detener en el algun caso if (encontrado && cont > posencontrado) { EjecutarCaso(fselecciona.Casos[cont]); SacarAmbito(fselecciona.Casos[cont].ambito.TablaSimbolo); } } cont++; } if (!encontrado && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno() && TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsRetorno()) { if (fselecciona.Defecto != null) { EjecutarCaso(fselecciona.Defecto); } } //si encontro un detener lo sacamos para que siga metiendo mas ambitos if (TablaVariables.IsDetener()) { TablaVariables.SacarVariable(); } } }
public void EjecutarFuncion(Simbolo simbolo) { FLlamada listaparametros = (FLlamada)simbolo.Objeto; Variables metodo = TablaVariables.BuscarMetodo(simbolo.Nombre, listaparametros); if (metodo != null) { FFuncion funcion = (FFuncion)metodo.Valor; FLlamada llamada = (FLlamada)simbolo.Objeto; if (funcion.Parametros.Count == llamada.Parametros.Count) { //metemos el return //Variables retorno = new Variables(Constante.TRetorno, Constante.TRetorno, Constante.RETORNO, null, null, 0, 0); //TablaVariables.Tabla.Add(retorno); int cont = 0; //meter variables de los parametros while (cont < funcion.Parametros.Count && TitusNotifiaciones.ContarErrores() == 0) { FExpresion f = (FExpresion)llamada.Parametros[cont]; NodoExpresion resultadoparametro = f.ResolverExpresion(funcion.Incerteza, funcion.RutaArchivo); if (TitusNotifiaciones.ContarErrores() == 0) { if (funcion.Parametros[cont].Tipo == resultadoparametro.Tipo) { Variables parametro = new Variables(funcion.Parametros[cont].Tipo, funcion.Parametros[cont].Nombre, Constante.TVariable, resultadoparametro, null, simbolo.Fila, simbolo.Columna); TablaVariables.Tabla.Add(parametro); } else { //error de asignacion del tipo de parametro TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un tipo: " + funcion.Parametros[cont].Tipo + ", no un tipo: " + resultadoparametro.Tipo, funcion.RutaArchivo, resultadoparametro.Linea.ToString(), resultadoparametro.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } cont++; } //ejecuatamos el metodo if (TitusNotifiaciones.ContarErrores() == 0) { Ejecutar execute = new Ejecutar(); execute.EjecutarInstrucciones(metodo.Ambito.TablaSimbolo); //obtenemos el valor del return if (TablaVariables.IsRetorno()) { TablaVariables.SacarVariable(); } execute.SacarAmbito(metodo.Ambito.TablaSimbolo); execute.SacarAmbito(funcion.Parametros); } } else { //error de cantidad de parametros TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "La funcion esperaba " + funcion.Parametros.Count + " parametros", funcion.RutaArchivo, simbolo.Fila.ToString(), simbolo.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "No existe la funcion " + simbolo.Nombre + "()", simbolo.RutaArchivo, simbolo.Fila.ToString(), simbolo.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } }
public void EjecutarPara(Simbolo para) { FPara fpara = (FPara)para.Objeto; //ejecutamos la declaracion EjecutarDeclaracion(fpara.Declaracion); NodoExpresion condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo); if (TitusNotifiaciones.ContarErrores() == 0) { if (condicion.Tipo == Constante.TBool) { while (TitusNotifiaciones.ContarErrores() == 0 && condicion.Booleano && !TablaVariables.IsRetorno() && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno()) { condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo); if (condicion.Booleano) { EjecutarInstrucciones(fpara.ambito.TablaSimbolo); } if (TablaVariables.IsContinuar()) { TablaVariables.SacarVariable(); } condicion = fpara.Condicion.ResolverExpresion(fpara.Incerteza, fpara.RutaArchivo); //sacamos el ambito SacarAmbito(fpara.ambito.TablaSimbolo); //realizamos la operacion ya sea ++ o -- if (fpara.Operacion == Constante.TAumento) { Variables var = TablaVariables.ObtenerTope(); if (var.Nombre == fpara.Declaracion.Nombre) { NodoExpresion val = (NodoExpresion)(var.Valor); val.Numero = val.Numero + 1; val.Cadena = val.Numero.ToString(); } } else { Variables var = TablaVariables.ObtenerTope(); if (var.Nombre == fpara.Declaracion.Nombre) { NodoExpresion val = (NodoExpresion)(var.Valor); val.Numero = val.Numero - 1; val.Cadena = val.Numero.ToString(); } } } if (TablaVariables.IsDetener()) { TablaVariables.SacarVariable(); } //sacamos la variable de operacion if (TablaVariables.ExisteVariableTope(fpara.Declaracion.Nombre)) { TablaVariables.SacarVariable(); } } else { TabError error = new TabError(); error.InsertarFila(Constante.ErroEjecucion, "Se esperaba un valor Bool no uno de tipo: " + condicion.Tipo, fpara.RutaArchivo, para.Fila.ToString(), para.Columna.ToString()); TitusNotifiaciones.setDatosErrores(error); } } }
public void EjecutarInstrucciones(List <Simbolo> instrucciones) { foreach (Simbolo instruccion in instrucciones) { if (TitusNotifiaciones.ContarErrores() == 0 && !TablaVariables.IsContinuar() && !TablaVariables.IsDetener() && !TablaVariables.IsRetorno()) { switch (instruccion.Rol) { case Constante.DECLARACION: EjecutarDeclaracion(instruccion); break; case Constante.ASIGNACION: EjecutarAsignacion(instruccion); break; case Constante.TDetener: EjecutarDetener(instruccion); break; case Constante.TRetorno: EjecutarRetorno(instruccion); break; case Constante.TContinuar: EjecutarContinuar(instruccion); break; case Constante.TSelecciona: EjecutarSelecciona(instruccion); break; case Constante.TMientras: EjecutarMientras(instruccion); break; case Constante.THasta: EjecutarHasta(instruccion); break; case Constante.TMostrar: FMostrar mostrar = (FMostrar)instruccion.Objeto; mostrar.Mostrar(instruccion.Fila, instruccion.Columna, mostrar.RutaArchivo); break; case Constante.TDibujarEXP: FDibujarExpresion dexp = (FDibujarExpresion)instruccion.Objeto; dexp.DibujarExpresion(); break; case Constante.TDibujarAST: FDibujarAST dast = (FDibujarAST)instruccion.Objeto; dast.DibujarAst(instruccion.Fila, instruccion.Columna); break; case Constante.TPara: EjecutarPara(instruccion); break; case Constante.LLAMADA_FUNCION: EjecutarFuncion(instruccion); break; case Constante.TSi: EjecutarSi(instruccion); break; } } } }
public void Mostrar(int Fila, int Columna, String ruta) { String cadena_nueva = ""; String numero = ""; bool posicion = false; for (int i = 0; i < Cadena.Length && TitusNotifiaciones.ContarErrores() == 0; i++) { char letra = Cadena[i]; if (posicion) { if (letra == '}') { posicion = false; try { int pos = Int32.Parse(numero); if (pos <= Parametros.Count - 1) { NodoExpresion val = Parametros[pos].ResolverExpresion(Incerteza, ruta); if (TitusNotifiaciones.ContarErrores() == 0) { if (val.Tipo == Constante.TNumber) { cadena_nueva = cadena_nueva + val.Numero.ToString(); } else if (val.Tipo == Constante.TString) { cadena_nueva = cadena_nueva + val.Cadena; } else { cadena_nueva = cadena_nueva + val.Cadena; } } } else { TabError Error = new TabError(); Error.InsertarFila(Constante.ErroEjecucion, "Acceso fuera de rango", "pendient", Fila.ToString(), Columna.ToString()); TitusNotifiaciones.setDatosErrores(Error); } } catch { TabError Error = new TabError(); Error.InsertarFila(Constante.ErroEjecucion, "El valor debe ser numerico mayor o igual a 0", "pendient", Fila.ToString(), Columna.ToString()); TitusNotifiaciones.setDatosErrores(Error); } } else { numero = numero + letra; } } else { if (letra == '{') { posicion = true; numero = ""; } else { cadena_nueva = cadena_nueva + letra; } } } if (TitusNotifiaciones.ContarErrores() == 0) { TitusNotifiaciones.ImprimirConsola(cadena_nueva); } }