Expression parseExpression(LineAwareBufferedReader reader, int expectedLevel) throws ScriptParsingException, IOException {
		skipBlankLines(reader);
		
		String line = stripComments(reader.readLine());
		int currentLine = reader.getCurrentLine();
		
		if (line == null) {
			return null;
		}

		// Find indentation level
		int actualLevel = 0;
		for (int i = 0; i < line.length(); i++) {
			if (line.charAt(i) == '\t') {
				actualLevel++;
			} else {
				break;
			}
		}
		
		// Check level
		if (actualLevel < expectedLevel) {
			// If line does not conform with expected level, put line back and stop parsing
			reader.putBack(line);
			return null;
		} else if (actualLevel > expectedLevel) {
			throw new ScriptParsingException(currentLine, "Wrong indentation");
		}
		
		String[] tokens = StringUtils.split(line.trim(),':');
		
		if (tokens.length == 0) {
			throw new ScriptParsingException(currentLine, "Expected identifier");
		} else if (tokens.length > 2) {
			throw new ScriptParsingException(currentLine, "Malformed expression. Too many ':' separators");
		}
		
		String identifier = tokens[0].trim();
		Value value;
		
		if (tokens.length == 1) {
			value = new CompoundValue(parseExpressionList(reader, expectedLevel + 1));
		} else {
			value = parseValue(tokens[1]);
		}
		
		return new Expression(identifier, value, currentLine);
	}