private void parseInstruction(Program program) {
		// Parse mnemonic (easy)
		String mnemonic = tokenizer.next().text;
		
		// Parse operands (hard)
		List<Operand> operands = new ArrayList<Operand>();
		boolean expectcomma = false;
		while (!tokenizer.check(TokenType.NEWLINE)) {
			if (!expectcomma) {
				if (tokenizer.check(TokenType.COMMA))
					throw new RuntimeException("Expected operand, got comma");
			} else {
				if (!tokenizer.check(TokenType.COMMA))
					throw new RuntimeException("Expected comma");
				tokenizer.next();
			}
			
			if (tokenizer.check(TokenType.REGISTER)) {
				operands.add(parseRegister(tokenizer.next().text));
			} else if (tokenizer.check(TokenType.DOLLAR)) {
				tokenizer.next();
				operands.add(parseImmediate());
			} else if (canParseImmediate() || tokenizer.check(TokenType.LEFT_PAREN)) {
				Immediate disp;
				if (canParseImmediate())
					disp = parseImmediate();
				else
					disp = ImmediateValue.ZERO;
				operands.add(parseMemory(disp));
			} else {
				throw new RuntimeException("Expected operand");
			}
			expectcomma = true;
		}
		
		program.addStatement(new InstructionStatement(mnemonic, operands));
	}