class VariableManager(object): def __init__(self): self.variables = {} self.shadowed = {} self.Memory = MemoryManager() self.error = False def __getitem__(self, var_name): return self.variables[var_name] def new_variable(self, name, _type, line, start_index=None, end_index=None): if name in self.variables.keys(): self.error = True original_var = self.variables[name] print( "Error! line {}\n" "Multiple declaration of a variable. {} already declared in {} line" .format(line, name, original_var.lineno), file=sys.stderr) else: if _type == "int": address = self.Memory.allocate(1) self.variables[name] = Int(lineno=line, address=address) elif _type == "tab": if start_index > end_index: print("Error! line {}\n" "Invalid range of tab {}\n".format(line, name), file=sys.stderr) tab_size = end_index - start_index + 1 address = self.Memory.allocate(tab_size) self.variables[name] = Tab(lineno=line, start_index=start_index, end_index=end_index, address=address) else: raise ValueError("No variable type ", _type) def new_iterator(self, name, line): if name in self.variables.keys(): self.shadowed[name] = self.variables[name] self.variables.__delitem__(name) # raise Warning("might be a problem") address = self.Memory.allocate_iterator() self.variables[name] = Int(lineno=line, address=address, is_iterator=True) # is initialized too def get_iterator_address(self, name): iterator = self.variables[name] if not iterator.is_iterator: raise Exception("U ARE PICKING NOT AN ITERATOR") return iterator.address def delete_iterator(self, name): iterator = self.variables[name] if not iterator.is_iterator: raise Exception("U ARE DELETING A VAR NOT ITER !!!") self.Memory.deallocate_iterator(iterator.address) self.variables.__delitem__(name) if name in self.shadowed.keys(): self.variables[name] = self.shadowed[name] def check_if_in_bounds(self, tab_name, index, line): tab = self[tab_name] if index < tab.start_index or tab.end_index < index: self.error = True print("Error! line {}\n" "Index {} is out of bounds for tab '{}'\n".format( line, index, tab_name), file=sys.stderr) return False return True