public void EjecutarDeclaracion(Simbolo global) { FExpresion expresion = (FExpresion)global.Objeto; if (expresion != null) { NodoExpresion valor = expresion.ResolverExpresion(expresion.Incerteza, expresion.RutaArchivo); if (TitusNotifiaciones.ContarErrores() == 0) { if (global.Tipo == Constante.TString) { if (valor.Tipo == Constante.TString || valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna)); } 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 (global.Tipo == Constante.TNumber) { if (valor.Tipo == Constante.TNumber || valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna)); } 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 (global.Tipo == Constante.TBool) { if (valor.Tipo == Constante.TBool) { valor.Tipo = valor.Tipo; TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, valor, null, global.Fila, global.Columna)); } 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 { TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TVariable, null, null, global.Fila, global.Columna)); } }
public void EjecutarRetorno(Simbolo retorno) { if (retorno.Objeto != null) { FExpresion aux = (FExpresion)retorno.Objeto; NodoExpresion val = aux.ResolverExpresion(retorno.Ambito.Incerteza, retorno.Ambito.RutaArchivo); if (TitusNotifiaciones.ContarErrores() == 0) { TablaVariables.Tabla.Add(new Variables(Constante.TRetorno, Constante.TRetorno, Constante.TRetorno, val, null, retorno.Fila, retorno.Columna)); } } else { TablaVariables.Tabla.Add(new Variables(Constante.TRetorno, Constante.TRetorno, Constante.TRetorno, null, null, retorno.Fila, retorno.Columna)); } }
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); } }