private boolean parseLocationPath(PsiBuilder builder, boolean isAbsolute, PsiBuilder.Marker... m) {
    assert m.length <= 1;

    PsiBuilder.Marker marker = m.length == 1 ? m[0] : builder.mark();
    if (isAbsolute) {
      // root step
      makeToken(builder);
      if (builder.getTokenType() == null) {
        marker.done(XPathElementTypes.STEP);
        return true;
      }
    }
    if (!parseStep(builder)) {
      marker.drop();
      return false;
    }
    marker.done(XPathElementTypes.STEP);
    marker = marker.precede();

    if (XPathTokenTypes.PATH_OPS.contains(builder.getTokenType())) {
      do {
        makeToken(builder);
        if (!parseStep(builder)) {
          builder.error(XPathBundle.message("parsing.error.location.step.expected"));
        }
        marker.done(XPathElementTypes.STEP);
        marker = marker.precede();
      } while (XPathTokenTypes.PATH_OPS.contains(builder.getTokenType()));
    }

    marker.drop();
    return true;
  }
private boolean parseLocationPath(PsiBuilder builder, boolean isAbsolute, PsiBuilder.Marker... m)