def METHOD_NAME(self, node, dim_decls):
    def parse_bounds(bounds_str):
        start_end = bounds_str.split(":")
        assert 1 <= len(start_end) <= 2
        return [self.parse_expr(node, s) for s in start_end]
    for decl in dim_decls:
        entity_match = self.ENTITY_RE.match(decl)
        assert entity_match
        groups = entity_match.groupdict()
        name = groups["name"]
        assert name
        if groups["shape"]:
            shape = [parse_bounds(s) for s in groups["shape"].split(",")]
        else:
            shape = None
        init_str = groups["initializer"]
        if init_str:
            init_str = init_str.replace("(/", "[")
            init_str = init_str.replace("/)", "]")
            init_expr = self.parse_expr(node, init_str)
            from numbers import Number
            if isinstance(init_expr, Number):
                initializer = init_expr
            elif isinstance(init_expr, list):
                for i, item in enumerate(init_expr):
                    if not isinstance(item, Number):
                        raise LoopyError("unexpected type of "
                                "item %d in initializer: %s"
                                % (i+1, type(init_expr).__name__))
                initializer = init_expr
            else:
                raise LoopyError("unexpected type of initializer: %s"
                        % type(init_expr).__name__)
        else:
            initializer = None
        yield name, shape, initializer