public object ejecutar(Ambito amb, AST arbol) { foreach (Simbolo variable in variables) { string nombreVar = variable.Id; if (esInicializada()) { Tipos tipoVal = valInicial.getTipo(amb, arbol); Tipos tipoVar = variable.Tipo; if (amb.existeActual(nombreVar)) { Console.WriteLine("Se intento declarar " + nombreVar + "una variable ya existente en el entorno actual"); } else { if (tipoVal == tipoVar) { object val = valInicial.getValorImplicito(amb, arbol); variable.Valor = val; amb.agregar(nombreVar, variable); } else { Console.WriteLine("Error de tipos" + ", se intenta setear un valor a la variable " + nombreVar + " diferente al que fue declarado"); } } } else { if (amb.existeActual(nombreVar)) { Console.WriteLine("Se intento declarar " + "una variable ya existente en el entorno actual"); } else { amb.agregar(nombreVar, variable); } } } return(null); }
//Obtener un simbolo en base a una clave public Simbolo get(string id) { try { for (Ambito a = this; a != null; a = a.anterior) { Simbolo siEncontro = (Simbolo)(a.tabla[id]); if (siEncontro != null) { return(siEncontro); } } return(null); } catch { Console.WriteLine("El simbolo: " + id + "no se declaro en el ambito actual ni externo (ambito.Ambito)"); return(null); } }
//Constructor que crea un nuevo ambito en base al anterior public Ambito(Ambito anterior) { tabla = new Hashtable(); this.anterior = anterior; }