private Expression parseAtom() throws ParseException {
		if (matches('(')) {
			match('(');
			Expression expression = parseExpression();
			match(')');
			return expression;
		} if (matches(Tag.IDENTIFIER)) {
			return parseVariable(false);
		} else if (matches('\\')) {
			match('\\');
			List<Variable> variables = new ArrayList<Variable>();
			do {
				Variable variable = parseVariable(true);
				variables.add(variable);
			} while (matches(Tag.IDENTIFIER));
			match(Tag.ABSTRACTOR);
			Expression body = parseExpression();
			for (Variable variable : variables) {
				context.closeVariable(variable);
			}
			return new Abstraction(variables, body);
		} else {
			unexpected();
			return null;
		}
	}