protected boolean parsePathExpression(PsiBuilder builder) {
    final PsiBuilder.Marker marker = builder.mark();

    if (!parseLocationPath(builder, false) && !parseAbsoluteLocationPath(builder)) {
      final PsiBuilder.Marker m2 = builder.mark();
      if (!parseFilterExpression(builder)) {
        m2.drop();
        marker.drop();
        return false;
      }

      if (XPathTokenTypes.PATH_OPS.contains(builder.getTokenType())) {
        makeToken(builder);
        if (!parseLocationPath(builder, false, m2)) {
          builder.error(XPathBundle.message("parsing.error.location.path.expected"));
        }
        marker.done(XPathElementTypes.LOCATION_PATH);
      } else {
        m2.drop();
        marker.drop();
      }
    } else {
      marker.done(XPathElementTypes.LOCATION_PATH);
    }

    return true;
  }
protected boolean parsePathExpression(PsiBuilder builder)