public void parse(String input) throws ParseException {
		String line;

		String lastOpcodeLine = null;

		List<String> lineBuffer = new ArrayList<String>();

		Iterator<String> it = Splitter.on('\n').split(input).iterator();
		
		while (it.hasNext()) {
			line = it.next();
			boolean isOpcode = (line.length() > 0 && line.charAt(0) != ' ' && line.charAt(0) != '\t');

			// Replace ^Z with a space
			line = line.replace('\u001a', ' ');
			// Trim spaces
			line = line.trim();
			// System.out.println(">" + line + "<");

			// One form of comment
			if (line.startsWith("*"))
				continue;

			// Slash or !@ indicates white-space preservation
			if (line.startsWith("/"))
				line = line.substring(1);
			else if (line.startsWith("!@"))
				line = line.substring(2);

			if (isOpcode) {
				// Major opcode, parse buffer
				if (lastOpcodeLine != null)
					parseLastOpcode(lastOpcodeLine, lineBuffer);

				lineBuffer.clear();

				lastOpcodeLine = removeComments(line);
			} else {
				lineBuffer.add(line);
			}
		}

		if (lastOpcodeLine.isEmpty())
			return;

		parseLastOpcode(lastOpcodeLine, lineBuffer);
	}