def tree_from_tokens_and_indx_actions(
     token_str_list: List[str], actions_vocab: List[str], actions_indices: List[int]
 ):
     builder = TreeBuilder()
     i = 0
     for action_idx in actions_indices:
         action = actions_vocab[action_idx]
         if action == REDUCE:
             builder.update_tree(action, None)
         elif action == SHIFT:
             builder.update_tree(action, token_str_list[i])
             i += 1
         else:
             builder.update_tree(action, action)
     tree = builder.finalize_tree()
     return tree
    def tree_from_tokens_and_indx_actions(
        token_str_list: List[str],
        actions_vocab: List[str],
        actions_indices: List[int],
        validate_tree: bool = True,
    ):
        builder = TreeBuilder()
        i = 0
        try:
            for action_idx in actions_indices:
                action = actions_vocab[action_idx]
                if action == REDUCE:
                    builder.update_tree(action, None)
                elif action == SHIFT:
                    builder.update_tree(action, token_str_list[i])
                    i += 1
                else:
                    builder.update_tree(action, action)

        except IndexError:
            builder = TreeBuilder()
            builder.update_tree(SHIFT, "IN:INVALID")
        tree = builder.finalize_tree(validate_tree=validate_tree)
        return tree