code: def add_action(self, node: Node) -> None:
          
          if node.expr.name and node.expr.name not in ['ws', 'wsp']:
              nonterminal = f'{node.expr.name} -> '
  
              if isinstance(node.expr, Literal):
                  right_hand_side = f'["{node.text}"]'
  
              else:
                  child_strings = []
                  for child in node.__iter__():
                      if child.expr.name in ['ws', 'wsp']:
                          continue
                      if child.expr.name != '':
                          child_strings.append(child.expr.name)
                      else:
                          child_right_side_string = child.expr._as_rhs().lstrip("(").rstrip(")") # pylint: disable=protected-access
                          child_right_side_list = [tok for tok in
                                                   WHITESPACE_REGEX.split(child_right_side_string) if tok]
                          child_right_side_list = [tok.upper() if tok.upper() in
                                                   self.keywords_to_uppercase else tok
                                                   for tok in child_right_side_list]
                          child_strings.extend(child_right_side_list)
                  right_hand_side = "[" + ", ".join(child_strings) + "]"
              rule = nonterminal + right_hand_side
              self.action_sequence = [rule] + self.action_sequence
docs: For each node, we accumulate the rules that generated its children in a list.