protected @Override Token getNewToken() throws ScannerException {
		charScanner.resetContext();
		final StringBuilder repr = new StringBuilder();
		try {
			appendToContext(' ');
			Char c;
			Char.Class cc;
			// consume whitespace
			try {
				do {
					c = charScanner.getToken();
					cc = c.getCharClass();
				} while ((cc == Char.Class.SPACE) || (cc == Char.Class.NEWLINE));
			} catch (NullPointerException e) { // EOF
				return null;
			}
			// what have we got?
			switch (cc) {
				case OPEN_PAREN:
					appendToContext('(');
					return BEGIN_EXP;
				case CLOSE_PAREN:
					appendToContext(')');
					return END_EXP;
				case ATOM:
					break;
				default:
					assert false: "Invalid character type (this should not happen)";
			}
			// scan whole ATOM
			try {
				do {
					repr.append((char) c.getCodepoint());
					c = charScanner.getToken();
				} while (c.getCharClass() == Char.Class.ATOM);
			} catch (NullPointerException e) { // EOF
				// break
			}
			charScanner.putToken(c);
			appendToContext(repr);
			return new TokenImpl(repr.toString(), Token.Class.ATOM);
		} catch (ScannerException e) {
			logger.error("Error scanning token");
			logger.debug("Context of causing scanner: " + e.getScanner().getContextString());
			logger.debug("Context of this scanner: " + getContextString());
			throw new ScannerException("Error scanning token", this, e);
		}
	}