code: def action(inner_rule, loc=None):
      
      def decorator(mapper):
          @llrule(loc, inner_rule.expected)
          def outer_rule(parser):
              result = inner_rule(parser)
              if result is unmatched:
                  return result
              if isinstance(result, tuple):
                  return mapper(parser, *result)
              else:
                  return mapper(parser, result)
          return outer_rule
      return decorator
docs: A decorator returning a function that first runs ``inner_rule`` and then, if its
      return value is not None, maps that value using ``mapper``.
  
      If the value being mapped is a tuple, it is expanded into multiple arguments.
  
      Similar to attaching semantic actions to rules in traditional parser generators.