s.nextToken();
    Tree treePattern() {        int base = sp;	Tree top = simplePattern();	if (s.token == COLON) {	    if (TreeInfo.isVarPattern(top))		return make.Typed(s.skipToken(), top, type1());	}	if( s.token == IDENTIFIER ) 	    {		if ( s.name == STAR ) /*         p*  becomes  z@( |(p,z))       */		    {			Name zname= fresh();			Tree zvar = make.Ident( s.pos, zname );						return make.Bind( s.pos, zname, 					  make.Alternative( s.pos, new Tree[] {					      make.Subsequence( s.pos, Tree.EMPTY_ARRAY ),					      make.Subsequence( s.pos, new Tree[] {						  top, 						  zvar })					  })); 		    } 		else if ( s.name == PLUS ) /*    p+   becomes   z@(p,(z| ))     */		    {			Name zname= fresh();			Tree zvar = make.Ident( s.pos, zname );						return make.Bind( s.pos, zname, 					  make.Subsequence( s.pos, new Tree[] {					      top,					      make.Alternative( s.pos, new Tree[] {						  zvar,			 			  make.Subsequence( s.pos, Tree.EMPTY_ARRAY ) })					  }));		    } 		else if ( s.name == OPT ) /*    p?   becomes   (p| )            */		    {			return make.Alternative( s.pos, new Tree[] {			    top,			    make.Subsequence( s.pos, Tree.EMPTY_ARRAY )});		    }	    }	while ((s.token == IDENTIFIER)&&( s.name != BAR )) {	    top = reduceStack(		false, base, top, s.name.precedence(), s.name.isLeftAssoc());	    push(top, s.pos, s.name);	    ident();	    top = simplePattern();	}	return reduceStack(false, base, top, 0, true);    }