code: def action_sequence_to_logical_form(self, action_sequence: List[str]) -> str:
          
          # Basic outline: we assume that the bracketing that we get in the RHS of each action is the
          # correct bracketing for reconstructing the logical form.  This is true when there is no
          # currying in the action sequence.  Given this assumption, we just need to construct a tree
          # from the action sequence, then output all of the leaves in the tree, with brackets around
          # the children of all non-terminal nodes.
  
          remaining_actions = [action.split(" -> ") for action in action_sequence]
          tree = Tree(remaining_actions[0][1], [])
  
          try:
              remaining_actions = self._construct_node_from_actions(tree, remaining_actions[1:])
          except ParsingError:
              logger.error("Error parsing action sequence: %s", action_sequence)
              raise
  
          if remaining_actions:
              logger.error("Error parsing action sequence: %s", action_sequence)
              logger.error("Remaining actions were: %s", remaining_actions)
              raise ParsingError("Extra actions in action sequence")
          return nltk_tree_to_logical_form(tree)
docs: Takes an action sequence as produced by :func:`logical_form_to_action_sequence`, which is a
          linearization of an abstract syntax tree, and reconstructs the logical form defined by that
          abstract syntax tree.