Advertisement
vikt144

step4

Jan 27th, 2020
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.96 KB | None | 0 0
  1.  //step4
  2. // https://anonfile.com/N9l1LeQ3n7/vm_7z
  3.  
  4. // файл usesStack.java
  5. import java.util.*;
  6. import forth.*;
  7.  
  8.  
  9. public class usesStack {
  10.  
  11.  
  12.     public static void main(String[] args) {
  13.  
  14.         Scanner in = new Scanner(System.in);
  15.  
  16.         System.out.println(" введите строку или end для выхода");
  17.  
  18.  //////////////////////////////////////////////STACK//////
  19.   STACK ST,STa;   // стеки данных и адресный      
  20.   ST=new STACK();
  21.   STa=new STACK();  
  22.   int[] stackarray = new int [20];
  23.   int[] adrstackarray = new int [20];  
  24.   int[] ports = new int[20];  
  25.  
  26.   ST.stack=stackarray;
  27.   STa.stack=adrstackarray;  
  28.   ////////////////////////////////////////
  29.  
  30.  fas as = new fas();
  31.  
  32.       as.ST=ST;  //   добавить стек
  33.       as.here=  2;
  34.       as.  latest=3;
  35.       as.state   =4;      
  36.       as.  memory[as.here]=6; //взято от балды
  37.       as.  memory[as.latest]=0; // записи в словари еще не создавались
  38.       as.  memory[as.state] =0; // 0 на данный момент исполнение        
  39.     Vector V=null;
  40.      V = as.initVirtualMem(0);
  41.     as.StringVector=V;
  42.  
  43.    FVM VM=new FVM();
  44.    VM.stack=as.ST;
  45.    VM.adrStack=STa;
  46.    VM.image=as.memory;
  47.    VM.ports=ports;
  48.    as.VM=VM;
  49.  
  50.    VM.as=as;
  51.  
  52.  
  53.  
  54. ////////////////////////////////// загрузка форт слов
  55. /*  перенесено в fas
  56.   public String initwords =        //  текст, определяющий опкоды виртуальной машины
  57.                                    //  " имя "  op  -1/1   immediate/noimmediate
  58.   " NOP 0  -1      LIT  1 -1      DUP  2  -1    DROP  3  -1  SWAP  4  -1 "+
  59.  "     PUSH  5  -1    POP  6 -1      CALL  7  -1    JUMP  8 -1   ;  9 1 " +
  60.    "  GT_JUMP   10 -1 LT_JUMP  11 -1  NE_JUMP  12  -1     EQ_JUMP  13  -1 " +
  61.    "  FETCH  14  -1   STORE  15  -1      " +
  62.   "   +  16  -1   -  17 -1   *  18  -1 DIVMOD  19  -1 " +
  63.   "   AND  20   -1   OR  21 -1   XOR  22  -1 SHL  23  -1  SHR  24 -1 "+
  64.   "   ZERO_EXIT  25 -1    INC  26  -1   DEC  27 -1 "+
  65.   "   IN  28  -1  OUT  29 -1    WAIT  30  -1 "+
  66.  "    LIT32  31 -1  endpart -111 -1 "+
  67. "end_ "
  68. ;  
  69. */
  70.   String ini =  as.initwords;
  71.   as.TIB=null; as.TIB=ini;
  72.   as._IN=0;
  73.   boolean enddo=false; //для выхода из цикла
  74.   do {
  75.  ///   String    name    = as.WORD(ini);
  76.     int old = as._IN;
  77.     as.ST.push(666);  
  78.     as.WORD();    // на стеке 0    
  79.     as.ST.pop();  // сброс стека
  80.     System.out.println("added " + as.StrBuffer);  
  81. //    as.cre1();  
  82.  
  83.    
  84.     if (as.StrBuffer.compareTo("end_") != 0) {
  85.       as._IN=old;  // вернуть указатель в строке
  86.       as.cre1();
  87.  
  88.       as.ST.push(666);
  89.       as.WORD();
  90.       as.ST.pop();  // сброс стека      
  91.       String codeString = as.StrBuffer;
  92.  
  93.       as.ST.push(666);
  94.       as.WORD();
  95.       as.ST.pop();  // сброс стека    
  96.       String immString  = as.StrBuffer;
  97.  
  98.       int code=0;
  99.       try { code=Integer.parseInt(codeString);} catch (Exception e){ System.out.print("num expected");}  
  100.  //     int imm=0;
  101.  //     try {imm=Integer.parseInt(immString);} catch (Exception e){ System.out.print("huynia imme");}  
  102.  //     boolean bool =  imm>0;
  103.  
  104.       as.ST.push(code); as.comma16();
  105.            
  106.       as.ST.push(9); as.comma16();  // 9 - код операции ";" возврат из подпрограммы
  107.  
  108. //System.out.print(name+code + " " +imm);
  109.       }
  110.        else enddo = true;
  111.      } while (! enddo) ;
  112.  
  113. ///////////////////////////////////////////
  114.  
  115.  as.TIB=null; as.TIB="EXIT  . "; as._IN=0; // тут дальнейшие определения
  116.  
  117.  as.cre1();  // создается  определение для exit
  118.  
  119.  as.exit_addr=as.memory[as.here];//сохранить точску входа в exit,чтобы положить на стек возвратов  
  120.  
  121.  as.ST.push(1); as.comma16();  // lit  
  122.  as.ST.push(0); as.comma16();  // 0
  123.  as.ST.push(1); as.comma16();  // lit  
  124.  as.ST.push(0); as.comma16();  // 0
  125.  as.ST.push(29); as.comma16(); // out      -- вывод в порт 0, номер фции 0 "exit"
  126. /*
  127.        as.find_("EXIT");
  128.        ST.pop(); //
  129.        as.exit_addr=ST.pop(); //сохранить точску входа в exit,чтобы положить на стек возвратов  
  130.  */
  131. // определяется "."
  132.  
  133.  as.cre1();
  134.   as.ST.push(1); as.comma16();  // lit  
  135.  as.ST.push(1); as.comma16();  // 1    
  136.  as.ST.push(1); as.comma16();  // lit  
  137.  as.ST.push(0); as.comma16();  // 0  // номер порта
  138.  as.ST.push(29); as.comma16(); // out      -- вывод в порт 0, номер фции 0 "exit"
  139.  
  140. /////////////////////////////////////////////////////
  141.  
  142. /*
  143. <адр строки> --  тут число , если ноль, то StrBuffer иначе индекс  в Vector
  144. */
  145.  
  146. System.out.println( "набирать  DUP SWAP ... большими буквами а end для выхода маленькими" );
  147.  
  148.  as.TIB=null; as.TIB="";  
  149.  // String TIB=as.TIB;  //
  150.  while (as.TIB.compareTo("end")!=0) {
  151.            as.TIB  =null;
  152.            as.TIB  =in.nextLine();
  153.                  
  154.         as._IN=0;                      // !  changed
  155.        boolean log = true;    
  156.            while ( log ) {
  157.        String st;//  = as.word_(TIB);
  158.         int old_in = as._IN;
  159.         as.ST.push(666);  
  160.         as.WORD();    // на стеке 0
  161. //System.out.println("getti "+ as.StrBuffer);      
  162.            st = as.StrBuffer;  //  ;   // !  changed
  163.        if (st=="") { log = false;  }
  164.               else { as.FIND();                // на стеке n  и
  165.                  int n = as.ST.pop();     // снять со стека признак немедленного исполнения
  166. //                     int ind = as.ST.pop();  // снять со стека cfa
  167.                  if (n==0) {
  168.                       as.number(); //забирает со стека <адр строки>
  169.                   if (as.error != 0)  {
  170.                                        log = false;
  171.                            System.out.println("слово " +  st + " не найдено" );
  172.                                                    as.error = 0;
  173.                            } else System.out.println("число " +  st + " на стеке" );
  174.  
  175.                   }
  176.                   else {
  177.                   // int ind = as.ST.pop();  // снять со стека cfa
  178.                   as.exec();
  179.                  
  180.                  
  181.                   }
  182.  
  183.                 }
  184.        }//while log
  185.  }//while      
  186.  
  187.   printm(as.memory,0  , 8 , 25 );      
  188.  
  189.   for (int k=0;k<V.size();k++) System.out.println(V.elementAt(k).toString() ) ;
  190.  
  191. //  System.out.println(as.getTypeData( V ,0 )  );
  192. }//main
  193.  
  194. static void printm(short[] mem,  int start , int str, int col) { //dump
  195.   int pos=start;
  196.   for (int l=0;l<str;l++) {
  197.    for (int k=0;k<col;k++) {
  198.      if (pos < mem.length )
  199.        {System.out.print(mem [pos]+" "); pos++;
  200.        }//endif
  201.      }//for  
  202.     System.out.println("# \n");
  203.  }//for
  204.  } //void
  205.  
  206. }//all
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement