code: public static <T> Parser<T> or(final Parser<? extends T>... alternatives) {
      if (alternatives.length == 0) return never();
      if (alternatives.length == 1) return alternatives[0].cast();
      return new Parser<T>() {
        @Override boolean apply(ParseContext ctxt) {
          final Object result = ctxt.result;
          final int at = ctxt.at;
          final int step = ctxt.step;
          for(Parser<? extends T> p : alternatives) {
            if (p.apply(ctxt)) {
              return true;
            }
            ctxt.set(step, at, result);
          }
          return false;
        }
        @Override public String toString() {
          return "or";
        }
      };
    }
docs: A {@link Parser} that tries each alternative parser in {@code alternatives}.
  
  <p> Different than {@link #alt(Parser[])}, it requires all alternative parsers to have
  type {@code T}.