Esempio n. 1
0
        public override void checkSemantica(TablaSimbolos tabla)
        {
            //Chequear que si la variable existe, sea una variable
            Object sym = tabla.buscar(id.Nombre);

            if (sym != null && sym.GetType() != typeof(Variable))
            {
                SemantErrorReport.Instancia.semantError(id, "el identificador " + id.Nombre + " es inválido");
            }

            expr.checkSemantica(tabla);

            //Agregar el id a la tabla de símbolos
            if (sym == null)
            {
                tabla.agregarId(id.Nombre, id);
            }

            id.checkTipo(tabla);
            //chequear el tipo del id y la expresión
            if (!id.Tipo_Expr.Equals(expr.Tipo_Expr))
            {
                SemantErrorReport.Instancia.semantError(id, "no se puede convertir valor de tipo " + expr.Tipo_Expr + " a tipo " + id.Tipo_Expr);
            }
        }
Esempio n. 2
0
        public override void checkSemantica(TablaSimbolos tabla)
        {
            sentencias.checkSemantica(tabla);

            condicion.checkSemantica(tabla);
            //validar que la condición sea de tipo booleana
            if (!condicion.Tipo_Expr.Equals(NucleoLenguaje.tipoBool))
            {
                SemantErrorReport.Instancia.semantError(condicion, "la condición del \"repeat-until\" debe ser un valor de tipo _lógico");
            }
        }
Esempio n. 3
0
        public override void checkSemantica(TablaSimbolos tabla)
        {
            Object sym = tabla.buscar(id);
            bool   exists = true, esVariable;

            //chequear que el método exista
            if (sym == null || sym.GetType() != typeof(FuncionDef))
            {
                SemantErrorReport.Instancia.semantError(this, "no se encuentra la definición para la función \"" + id + "\"");
                exists = false;
            }

            //chequear que los tipos de los paramétros se correspondan con los de la función
            if (exists)
            {
                FuncionDef f = (FuncionDef)sym;

                if (f.Parametros.getLongitud() != lparams.getLongitud())
                {
                    SemantErrorReport.Instancia.semantError(this, "la cantidad de paramétros no coincide con la definición de la función \"" + id + "\"");
                }
                else
                {
                    for (int i = 0; i < lparams.getLongitud(); i++)
                    {
                        Expresion param = lparams.getLista()[i];

                        //si el paramétro es una variable agregarlo a la tabla de simbolo
                        esVariable = false;
                        if (param.GetType() == typeof(Variable))
                        {
                            if (tabla.buscar(((Variable)param).Nombre) == null)
                            {
                                tabla.agregarId(((Variable)param).Nombre, param);
                            }
                            esVariable = true;
                        }

                        param.checkSemantica(tabla);
                        if (!param.Tipo_Expr.Equals(f.Parametros.getLista()[i].Tipo) ||
                            (f.Parametros.getLista()[i].EsDireccion && !esVariable))
                        {
                            SemantErrorReport.Instancia.semantError(param, "el tipo de paramétro no coincide con la definición de la función \"" + id + "\"");
                        }
                    }
                }
            }
        }