code: Expr staticMember() {
  		if (peek().sym != Sym.ID) {
  			return sharedMethod();
  		}
  		
  		int begin = forward;
  		while (move().sym == Sym.DOT && move().sym == Sym.ID) {
  			;
  		}
  		// ID.ID.ID::
  		if (peek().sym != Sym.STATIC || tokenList.get(forward - 1).sym != Sym.ID) {
  			resetForward(begin);
  			return sharedMethod();
  		}
  		
  		String clazz = getClazz(begin);
  		match(Sym.STATIC);
  		String memberName = match(Sym.ID).value();
  		
  		// com.jfinal.kit.Str::isBlank(str)
  		if (peek().sym == Sym.LPAREN) {
  			move();
  			if (peek().sym == Sym.RPAREN) {
  				move();
  				return new StaticMethod(clazz, memberName, location);
  			}
  			
  			ExprList exprList = exprList();
  			match(Sym.RPAREN);
  			return new StaticMethod(clazz, memberName, exprList, location);
  		}
  		
  		// com.jfinal.core.Const::JFINAL_VERSION
  		return new StaticField(clazz, memberName, location);
  	}
docs: staticMember
  : ID_list '::' ID
  | ID_list '::' ID '(' exprList? ')'