Пример #1
0
        public void LlenarGlobal()
        {
            //metemos las variables globales a la tabla y los metodos del primer archivo
            foreach (Simbolo global in Inicio.Global.TablaSimbolo)
            {
                switch (global.Rol)
                {
                case Constante.DECLARACION:
                    if (!TablaVariables.BuscarNombre(global.Nombre))
                    {
                        EjecutarDeclaracion(global);
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo o variable con el nombre " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }
                    break;

                case Constante.TPrincipal:
                    if (TablaVariables.Tabla[0].Nombre != Constante.TPrincipal)
                    {
                        TablaVariables.Tabla[0] = new Variables(Constante.TPrincipal, Constante.TPrincipal, Constante.TPrincipal, global.Objeto, global.Ambito, global.Fila, global.Columna);
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo principal", global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }

                    break;

                case Constante.FUNCION:
                    if (TablaVariables.BuscarVariable(global.Nombre) == null)
                    {
                        if (TablaVariables.BuscarMetodo(global.Nombre, (FFuncion)global.Objeto) == false)
                        {
                            TablaVariables.Tabla.Add(new Variables(global.Tipo, global.Nombre, Constante.TMetodo, global.Objeto, global.Ambito, global.Fila, global.Columna));
                        }
                        else
                        {
                            TabError error = new TabError();
                            error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarado un metodo con el nombre " + global.Nombre + " y los mismos parametros", global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                            TitusNotifiaciones.setDatosErrores(error);
                        }
                    }
                    else
                    {
                        TabError error = new TabError();
                        error.InsertarFila(Constante.ErroEjecucion, "Ya hay declarada una variable con el metodo " + global.Nombre, global.RutaArchivo, global.Fila.ToString(), global.Columna.ToString());
                        TitusNotifiaciones.setDatosErrores(error);
                    }
                    break;
                }
            }
        }
Пример #2
0
        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);
            }
        }