public override TypeReturn CheckSemantics(List <Scope> scope_list, List <Error> errors) { //chequeamos si el tipo del array ya se definio anteriormente TypeReturn typeOfArray = Utils.FindType(scope_list, Name); if (typeOfArray == null) { errors.Add(new Error(line, column, "El tipo " + this.Name + "no se ha delcarado todavia")); } //verificamos que la expresion de inicializacion devuelva algun valor(puede ser nil) TypeReturn typeOfInitial = Initial.CheckSemantics(scope_list, errors); if (typeOfInitial is ReturnNotValue || typeOfInitial == null) //pregunto por null porque si hubo un error devuelvo null { errors.Add(new Error(line, column, "La expresion de la inicializacion del array debe devolver algun valor")); } if (!(typeOfArray is ReturnArray)) //el tipo no es un array { errors.Add(new Error(line, column, "El tipo " + "'" + this.Name + "'" + " no es de tipo array")); } else { if (typeOfInitial is ReturnNil) //si es nil no pueden ser int los valores del array { if ((typeOfArray as ReturnArray).Type_Of_Elements is ReturnInt) { errors.Add(new Error(line, column, "El array no permite 'nil' porque los valores del array son 'int'")); } } else if (((ReturnArray)typeOfArray).Type_Of_Elements.ToString() != typeOfInitial.ToString()) { errors.Add(new Error(line, column, "Los elementos del array son de tipo '" + ((ReturnArray)typeOfArray).Type_Of_Elements.ToString() + "' y no de tipo '" + typeOfInitial.ToString() + "'")); } } //verificamos que el size es un entero TypeReturn typeOfSize = Size.CheckSemantics(scope_list, errors); if (!(typeOfSize is ReturnInt)) { errors.Add(new Error(line, column, "La expresion del tamaƱo del array no devuelve un entero")); } Array = typeOfArray as ReturnArray; //para usarlo en la generacion de codigo return((typeOfArray != null) ? typeOfArray : new ReturnArray(this.Name, typeOfInitial)); //retorno el array }