Ejemplo n.º 1
0
  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;
  }
Ejemplo n.º 2
0
 // FIXME:CraeteData
 public boolean CreateData(VMData data, int code_size) {
   data.command = new byte[code_size];
   data.command_size = code_size;
   data.value_size = variables.size();
   Iterator<VMCode> it = statement.iterator();
   int p = 0;
   // NOTE: I forget "while" isn't 'if' !!!
   while (it.hasNext()) {
     VMCode code = it.next();
     p = code.Get(data.command, p);
   }
   return true;
 }
Ejemplo n.º 3
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;
 }
Ejemplo n.º 4
0
 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("---");
 }