public boolean compile(String str, VMData data) {
		file = str; 
		//FIXME:
		int result = 0;
		//
		ANTLRStringStream input = new ANTLRStringStream(str);
		MemoryBasicLexer lexer = new MemoryBasicLexer(input);
		CommonTokenStream tokens = new CommonTokenStream(lexer);
		MemoryBasicParser parser = new MemoryBasicParser(tokens);
		// Share data here 
		parser.driver = this;
		try {
			parser.compilationUnit();
		} catch (RecognitionException e) {
			e.printStackTrace();
			result = -1;
		} finally {
			parser.driver = null;
		}
		if (result != 0) {
			return false;
		}
		while (!state_stack.empty()) {
			State state = state_stack.peek();
			switch (state.getState()) {
			case State.STATE_IF:
				error("if does not match endif");
				break;

			case State.STATE_FOR:
				error("for does not match next");
				state.setEnd(null);
				state.setStep(null);
				break;

			case State.STATE_WHILE:
				error("while does not match wend");
				break;
			}
			state_stack.pop();
		}
		//FIXME:
		VMCode code = statement.get(statement.size() - 1);
		if (code.getOp() != VMCode.VM_HALT) {
			OpHalt();
		}
		int code_size = LabelSetting();
		//FIXME:CraeteData
		//from statements to data (dump to byte array) 
		CreateData(data, code_size);
		return error_count == 0;
	}