Exemplo n.º 1
0
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