@Override
	public void run() throws TaskIncompleteException {
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(taskFile));

			String line;
			Queue<String> buffer = new LinkedList<String>(q);
			q.clear();
			while ((line = br.readLine()) != null) {
				line.trim();

				// variable definition
				Matcher md = VARIABLE_DEFINITION.matcher(line);
				if (md.lookingAt()) {
					variableTable.put(md.group(1), md.group(2));
					continue;
				}

				// comment skip
				Matcher mc = COMMENT_LINE.matcher(line);
				if (mc.lookingAt())
					continue;

				// variable substitution
				Matcher ms = VARIABLE_EXPANSION.matcher(line);
				StringBuffer sb = new StringBuffer();
				while (ms.find()) {
					String k = ms.group(1);
					String v = variableTable.containsKey(k) ? variableTable.get(k) : "";
					ms.appendReplacement(sb, v);
				}
				ms.appendTail(sb);
				line = sb.toString();

				q.add(line);
			}
			while (!buffer.isEmpty())
				q.add(buffer.poll());
		} catch (IOException e) {
			throw new TaskIncompleteException(e.getMessage());
		} finally {
			try {
				if (br != null)
					br.close();
			} catch (IOException e) {
				throw new TaskIncompleteException(e.getMessage());
			}
		}
	}