code: def expand_rule(self, rule):
          "Returns all init_ptrs accessible by rule (recursive)"
          init_ptrs = set()
          def _expand_rule(rule):
              assert not rule.is_term, rule
  
              for r in self.rules_by_origin[rule]:
                  init_ptr = RulePtr(r, 0)
                  init_ptrs.add(init_ptr)
  
                  if r.expansion: # if not empty rule
                      new_r = init_ptr.next
                      if not new_r.is_term:
                          yield new_r
  
          for _ in bfs([rule], _expand_rule):
              pass
  
          return fzset(init_ptrsf expand_rule(self, rule):
          "Returns all init_ptrs accessible by rule (recursive)"
          init_ptrs = set()
          def _expand_rule(rule):
              assert not rule.is_term, rule
  
              for r in self.rules_by_origin[rule]:
                  init_ptr = RulePtr(r, 0)
                  init_ptrs.add(init_ptr)
  
                  if r.expansion: # if not empty rule
                      new_r = init_ptr.next
                      if not new_r.is_term:
                          yield new_r
  
          for _ in bfs([rule], _expand_rule):
              pass
  
          return fzset(init_ptrs)
docs: Returns all init_ptrs accessible by rule (recursive)