public boolean execute(){
		if (deque == null) {
			throw new IllegalStateException("You must parse the code before executing.");
		}
		if (!canExecute) {
			throw new IllegalStateException("Cannot execute code now. Not compiled, or"
					+ " execution reached error, or execution reached end.");
		}

		if(deque.isEmpty()){
			this.executionMessage = "Code has finished running";
			canExecute = false;
			return false;
		}
		
		Executable exe = deque.removeFirst();
		
		if(exe instanceof Instruction){
			Instruction instr = (Instruction)exe;
			try{
				callKarel(instr.action);
			}catch(KRuntimeException kre){
				this.executionMessage = kre.getMessage();
				canExecute = false;
				return false;
			}catch(RuntimeException re){
				this.executionMessage = re.getMessage();
				canExecute = false;
				return false;
			}
			this.executionMessage = _getExecutionMessage(instr.action);
			this.executionLine = instr.lineNumber;
			return true;
		}else if(exe instanceof BranchOnFalse){
			
			BranchOnFalse bof = (BranchOnFalse)exe;
			
			if(evaluateProposition(bof.prop)){
				return execute();
			}else{
				goToOffset(bof.offset);
				return execute();	
				// if bof is false, pop offset and evaluate (offset must pop off Jump)
			}
		}else if(exe instanceof Jump){
			Jump jump = (Jump)exe;
			goToOffset(jump.offset);
			return execute();
		}else{
			throw new RuntimeException("Unknown object in code");
		}		
	}