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 + "\""); } } } } }
//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); }