IToken tok;
IToken tok = null;
	public List parseDottedNamePattern() {		List names = new ArrayList();		StringBuffer buf = new StringBuffer();		IToken previous = null;		while (true) {			IToken tok;			int startPos = tokenSource.peek().getStart();			String afterDot = null;			while (true) {				tok = tokenSource.peek();				if (previous != null) {					if (!isAdjacent(previous, tok)) break;				}				if (tok.getString() == "*" || tok.isIdentifier()) {					buf.append(tok.getString());				} else if (tok.getLiteralKind() != null) {					//System.err.println("literal kind: " + tok.getString());					String s = tok.getString();					int dot = s.indexOf('.');					if (dot != -1) {						buf.append(s.substring(0, dot));						afterDot = s.substring(dot+1);						previous = tokenSource.next();						break;					}					buf.append(s);  // ??? so-so				} else {					break;				}				previous = tokenSource.next();				//XXX need to handle floats and other fun stuff			}			int endPos = tokenSource.peek(-1).getEnd();			if (buf.length() == 0 && names.isEmpty()) {				throw new ParserException("expected name pattern", tok);			} 						if (buf.length() == 0) {				names.add(NamePattern.ELLIPSIS);			} else {				checkLegalName(buf.toString(), previous);				NamePattern ret = new NamePattern(buf.toString());				ret.setLocation(sourceContext, startPos, endPos);				names.add(ret);			}						if (afterDot == null) {				buf.setLength(0);				if (!maybeEat(".")) break;				else previous = tokenSource.peek(-1);			} else {				buf.setLength(0);				buf.append(afterDot);				afterDot = null;			}		}		//System.err.println("parsed: " + names);		return names;	}