public Token read() throws IOException {
		try {
			
			while (reader.ready()) {
				int c = reader.read();
				
				if (Character.isWhitespace(c)) {
					whitespaceReader.readValue(reader, c);
				} else if (Character.isLetter(c)) {
					return identifierReader.getToken(reader, c);
				} else if (Character.isDigit(c)) {
					return numberReader.getToken(reader, c);
				} else if (c == '"') {
					return stringReader.getToken(reader, c);
				} else {
					return symbolReader.getToken(reader, c);
				}
			}
			return null;
			
		} catch (IOException e) {
			e.printStackTrace();
			throw e;
		}
	}