code: final public Step step() throws ParseException {
    Token slash = null;
    String nt;
    Vector pl = null;
    Predicate p;
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
      case SLASH:
        slash = jj_consume_token(SLASH);
        break;
      default:
        jj_la1[2] = jj_gen;
        ;
      }
      nt = nameTest();
      label_1:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
        case START_BRACKET:
          ;
          break;
        default:
          jj_la1[3] = jj_gen;
          break label_1;
        }
        p = predicate();
            if (pl == null) pl = new Vector();
            pl.add(p);
      }
     // if 'slash != null', then we have '//' versus '/'
     {if (true) return new Step(slash != null, nt, pl);}
      throw new Error("Missing return statement in function");
    }
docs: /*
  (i'm doing something perhaps unusual here, including the <SLASH>
  as if it were part of the step.  this mechanism for differentiating
  '/' from '//' seems most natural, even if it is a bit unconventional.)