docs: def revert_cnf(node):
      """Reverts a parse tree (RuleNode) to its original non-CNF form (Node)."""
      if isinstance(node, T):
          return node
      # Reverts TERM rule.
      if node.rule.lhs.name.startswith('__T_'):
          return node.children[0]
      else:
          children = []
          for child in map(revert_cnf, node.children):
              # Reverts BIN rule.
              if isinstance(child, RuleNode) and child.rule.lhs.name.startswith('__SP_'):
                  children += child.children
              else:
                  children.append(child)
          # Reverts UNIT rule.
          if isinstance(node.rule, UnitSkipRule):
              return unroll_unit_skiprule(node.rule.lhs, node.rule.rhs,
                                      node.rule.skipped_rules, children,
                                      node.rule.weight, node.rule.alias)
          else:
              return RuleNode(node.rule, children)