def apply(match_method_name)
      start_pos = @scanner.pos
      if m = memo(match_method_name, start_pos)
        recall m, match_method_name
      else
        m = inject_fail match_method_name, start_pos
        save m, eval_rule(match_method_name)
      end
    end
def apply(match_method_name)
      start_pos = @scanner.pos
      if m = memo(match_method_name, start_pos)
        recall m, match_method_name
      else
        m = inject_fail match_method_name, start_pos
        save m, eval_rule(match_method_name)
      end
    end
Apply a rule by dispatching to the given match method. The result of
 applying the rule is memoized so that the match method is invoked at most
 once at a given parse position.

 @param (see RecursiveDescentParser#apply)
 @return (see RecursiveDescentParser#apply)