public void debug_dump() { System.out.println("---variables---"); variables.dump(); String[] op_name = VMCode.VM_OP_NAMES; System.out.println("---code---"); int pos = 0; int size = statement.size(); for (int i = 0; i < size; i++) { VMCode code = (VMCode) statement.get(i); System.out.print(pos + ": " + op_name[code.getOp()]); if (code.getSize() > 1) { System.out.print(", " + code.getArg1()); } System.out.println(); if (code.getOp() != VMCode.VM_MAXCOMMAND) { pos += code.getSize(); } } System.out.println("---"); }
public boolean compile(String str, VMData data) { file = str; // FIXME: int result = 0; // ANTLRStringStream input = new ANTLRStringStream(str); StackBasicLexer lexer = new StackBasicLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); StackBasicParser parser = new StackBasicParser(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.setStart(null); 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; }
public int LabelSetting() { int pos = 0; Iterator<VMCode> it = statement.iterator(); while (it.hasNext()) { VMCode code = it.next(); if (code.getOp() == VMCode.VM_MAXCOMMAND) { labels.get(code.getArg1()).setPos(pos); } else { pos += code.getSize(); } } Iterator<VMCode> it2 = statement.iterator(); while (it2.hasNext()) { VMCode code = it2.next(); switch (code.getOp()) { case VMCode.VM_JMP: case VMCode.VM_JMPC: case VMCode.VM_JMPNC: code.setArg1(labels.get(code.getArg1()).getPos()); break; } } return pos; }