Exemplo n.º 1
0
 def _extend_cst(self, node):
     if node is None:
         return
     previous = self.cst
     if previous is None:
         self.cst = self._copy_node(node)
     elif is_list(node):
         if is_list(previous):
             previous.extend(node)
         else:
             self.cst = [previous] + node
     elif is_list(previous):
         previous.append(node)
     else:
         self.cst = [previous, node]
Exemplo n.º 2
0
 def _copy_node(self, node):
     if node is None:
         return None
     elif is_list(node):
         return node[:]
     else:
         return node
Exemplo n.º 3
0
 def _add_cst_node(self, node):
     if node is None:
         return
     previous = self.cst
     if previous is None:
         self.cst = self._copy_node(node)
     elif is_list(previous):
         previous.append(node)
     else:
         self.cst = [previous, node]
Exemplo n.º 4
0
 def walk(self, node, *args, **kwargs):
     if isinstance(node, Node):
         children = [self.walk(c, *args, **kwargs) for c in node.children()]
         return super().walk(node, children, *args, **kwargs)
     elif isinstance(node, Mapping):
         return {n: self.walk(e, *args, **kwargs) for n, e in node.items()}
     elif is_list(node):
         return [self.walk(e, *args, **kwargs) for e in iter(node)]
     else:
         return super().walk(node, [], *args, **kwargs)
Exemplo n.º 5
0
 def walk(self, node, *args, **kwargs):
     supers_walk = super(DepthFirstWalker, self).walk
     if isinstance(node, Node):
         children = [self.walk(c, *args, **kwargs) for c in node.children()]
         return supers_walk(node, children, *args, **kwargs)
     elif isinstance(node, collections.Mapping):
         return {n: self.walk(e, *args, **kwargs) for n, e in node.items()}
     elif is_list(node):
         return [self.walk(e, *args, **kwargs) for e in iter(node)]
     else:
         return supers_walk(node, [], *args, **kwargs)
Exemplo n.º 6
0
 def walk(self, node, *args, **kwargs):
     supers_walk = super(DepthFirstWalker, self).walk
     if isinstance(node, Node):
         children = [self.walk(c, *args, **kwargs) for c in node.children()]
         return supers_walk(node, children, *args, **kwargs)
     elif isinstance(node, collections.Mapping):
         return {n: self.walk(e, *args, **kwargs) for n, e in node.items()}
     elif is_list(node):
         return [self.walk(e, *args, **kwargs) for e in iter(node)]
     else:
         return supers_walk(node, [], *args, **kwargs)
Exemplo n.º 7
0
    def _isolate(self, block, drop=False):
        self._push_cst()
        try:
            block()
            cst = self.cst
        finally:
            self._pop_cst()

        if is_list(cst):
            cst = closure(cst)
        if not drop:
            self._add_cst_node(cst)
        return cst
Exemplo n.º 8
0
    def _isolate(self, block, drop=False):
        self._push_cst()
        try:
            block()
            cst = self.cst
        finally:
            self._pop_cst()

        if is_list(cst):
            cst = closure(cst)
        if not drop:
            self._add_cst_node(cst)
        return cst
Exemplo n.º 9
0
    def _set(self, key, value, force_list=False):
        key = self._safekey(key)
        previous = self.get(key)

        if previous is None and force_list:
            value = [value]
        elif previous is None:
            value = value
        elif is_list(previous):
            value = previous + [value]
        else:
            value = [previous, value]

        super().__setitem__(key, value)
Exemplo n.º 10
0
    def set(self, key, value, force_list=False):
        key = self._safekey(key)

        previous = self.get(key)
        if previous is None:
            if force_list:
                super().__setitem__(key, [value])
            else:
                super().__setitem__(key, value)
            self._order.append(key)
        elif is_list(previous):
            previous.append(value)
        else:
            super().__setitem__(key, [previous, value])
        return self
Exemplo n.º 11
0
    def set(self, key, value, force_list=False):
        key = self._safekey(key)

        previous = self.get(key)
        if previous is None:
            if force_list:
                super(AST, self).__setitem__(key, [value])
            else:
                super(AST, self).__setitem__(key, value)
            self._order.append(key)
        elif is_list(previous):
            previous.append(value)
        else:
            super(AST, self).__setitem__(key, [previous, value])
        return self
Exemplo n.º 12
0
 def _save_result(self, key, result):
     if is_list(result.node):
         result = RuleResult(closure(result.node), result.newpos,
                             result.newstate)
     self._results[key] = result
Exemplo n.º 13
0
 def copy(self):
     return AST((k, v[:] if is_list(v) else v) for k, v in self.items())
Exemplo n.º 14
0
 def _save_result(self, key, node):
     if is_list(node):
         node = closure(node)
     self._results[key] = self._mkresult(node)
Exemplo n.º 15
0
 def _save_result(self, key, node):
     if is_list(node):
         node = closure(node)
     self._results[key] = self._mkresult(node)
Exemplo n.º 16
0
 def copy(self):
     return AST(
         (k, v[:] if is_list(v) else v)
         for k, v in self.items()
     )