Пример #1
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 + "\"");
                        }
                    }
                }
            }
        }
Пример #2
0
        //Se inicializa la lista de funciones basicas incluyendo la definicion en Intermediate Language de la funcion [FuncionesEstandar.x]
        private void agregarFuncBasicas()
        {
            ListaParamFormal formal;
            FuncionDef f;

            formal = new ListaParamFormal();
            formal.agregarElemento(new ParamFormal(tipoEntero, new SimboloId("x", 0, 0), true, 0, 0));
            f = new FuncionDef(idRead, formal, 0, 0, FuncionesEstandar.metodoFuncionRead);
            funcBasicas.Add(f);

            formal = new ListaParamFormal();
            formal.agregarElemento(new ParamFormal(tipoEntero, new SimboloId("x", 0, 0), 0, 0));
            f = new FuncionDef(idWrite, formal, 0, 0, FuncionesEstandar.metodoFuncionWrite);
            funcBasicas.Add(f);
        }