SHARE
TWEET

stp 5 fas

vikt144 Feb 3rd, 2020 1 in 203 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. // file    forth/fas.java
  3. package forth;
  4. /*
  5.  
  6. */
  7.    
  8. import java.util.*;
  9. import java.lang.*;
  10.  
  11. import java.io.*;
  12. import java.io.File;
  13. import java.io.FileOutputStream;
  14. import java.io.FileWriter;
  15. import java.io.FileReader;
  16.  
  17. public class fas {
  18.  
  19.   public STACK ST;
  20.   public FVM VM;
  21.  
  22. /// vector and crea
  23.  
  24. public   static int here;  // адрес переменной HERE в массиве memory
  25. public   static int latest; // адрес переменной LATEST в массиве memory
  26. public   static int state;
  27. // static
  28.  public short[] memory = new short[2000];  //выделяем память из 16 битных целых размером в 2000
  29.  
  30.  public int exit_addr;  //адрес процедуры выхода
  31.  
  32. //////////////////////////////////////////////////////////  vectors
  33. public  Vector StringVector;
  34.  
  35. public Vector initVirtualMem(int i) {
  36.  Vector v = new Vector();
  37.  Integer I = new Integer(i);  // тип Integer, это объектное представление типа int
  38.  v.addElement(I);  
  39.  return v;
  40. }
  41.  
  42.  
  43. public int appendData(Vector v,Object obj) {
  44.  
  45.     Integer  Ind = (Integer)v.elementAt(0);   // получить значение начального элемента вектора как Integer
  46.     int ind = Ind.intValue();                      // преобразовать в нормальный int
  47.    
  48.     if ( ind == 0) {                                  // если равен 0, то свободных элементов нет
  49.       v.addElement(obj);//                    // тогда добавляем объект  к вектору
  50.       ind=v.size()-1;
  51.       }
  52.         else {
  53.           Integer I =( Integer)v.elementAt(ind);  // иначе ind указывает на свободный элемент (СЭ)
  54.           int i = I.intValue();                                //там хранится предыдущий  (СЭ) который получаем
  55.     v.setElementAt(obj, ind);                  // Замещаем элемент вектора с номером ind объектом obj
  56.     v.setElementAt(I, 0);                    // в начальный элемент вектора пишем предыдущий  СЭ
  57.           }
  58.  
  59.   return ind;          // возвращаем индекс объекта в векторе
  60. }
  61.  
  62.   public int removeData (Vector v, int ind){
  63.     int ret = 0;
  64.     if ( ind>v.size()-1) return  -1 ;
  65.     if (getTypeData( v, ind).compareTo("java.lang.Integer")==0 )  return  -2 ;
  66.      
  67.     if ( ind==v.size()-1) v.removeElementAt(ind) ;
  68.       else {
  69.            v.setElementAt(null, ind);
  70.            Integer IndOld=(Integer)v.elementAt(0); // получить предыдущее знач 0 элемента
  71.            int ind_=IndOld.intValue();  
  72.            v.setElementAt(IndOld, ind);     // записать его в элемент который на удаление
  73.            Integer IndNew = new Integer(ind);
  74.            v.setElementAt(IndNew, 0);   // 0 элемент указывает на новый        
  75.     }        
  76.   return ret;
  77.   }
  78.  
  79. public String getStringv(Vector v, int ind){
  80.   return (String)v.elementAt(ind);
  81. }
  82.  
  83. public String getTypeData( Vector v, int ind){
  84. return  v.elementAt(ind) . getClass().getName() ;
  85. }
  86.  
  87. // link strsize nomberVector
  88.  
  89. ////////////////////////////////////////////////////////////////////////////////////
  90.  
  91.  public  void immediate() {
  92.    
  93.    short l = memory[latest];
  94.    short i = memory[l+1];
  95.    if (i>0) i = (short)(0-i);
  96.    memory[l+1]=i;
  97.  }
  98.  
  99.  
  100. public void comma16() {  // эквивалентно запятая "," только снимает 16 bit
  101.   short i = (short)ST.pop();
  102.   int adr = memory[here];
  103.   memory[adr]=i;
  104.   memory[here]++;
  105. }
  106.  
  107. public void comma() {
  108.     int adr = memory[here] ;
  109.     int y= ST.pop(); // на два 16 битных с помощью сдвигов
  110.     short a=(short)y ,  b = (short) (y >> 16);
  111.     memory[adr] =b ;   memory[adr+1]=a;
  112.      ST.push(2); allot();
  113.  
  114. }
  115.  
  116.  public  void cre1() { // (String s) {   // временная вспомогательная ф-ция. создающая упрощенную запись в словаре
  117.   ST.push(666);  // код бланк для word - пока не используется
  118.   WORD();
  119.   ST.pop();            // сброс стека, world пока возвращает только 0
  120.   String s=StrBuffer. toUpperCase(); // реализовать проверку на ""  //
  121.  
  122.   short tmp = memory[here]; //получить here
  123.   ST.push(memory[latest] );
  124.   comma16();
  125.   memory[latest]=tmp;  
  126.  
  127.   ST.push( s.length() );
  128.   comma16();
  129.   ST.push( appendData(StringVector, s) ); //appendData возвращает индекс на строку
  130.   comma16();
  131.   ST.push(0);
  132.   comma16();
  133. }
  134.  
  135. public void setCFA() {
  136.   int i = ST.pop();     // снять со стека нужное значение cfa
  137.   memory[ memory[latest] + 3] = (short)i;    
  138.   if (i < 0) System.out.println("cfa  -- "+i);
  139. }
  140.  
  141. public int error = 0;
  142.  
  143. public void number() {  //  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! адрес строки не реализован
  144.   int ind = ST.pop(); // снять адр строки
  145.   String s = StrBuffer;
  146.   int ii;
  147.   try {ii = Integer.parseInt(s);
  148.        ST.push(ii);
  149.       } catch (Exception e) {error=-1; }
  150.  
  151. }
  152. /////////////////////////////////////////////////////compile exec//////////////////////////////////
  153.  
  154. public void exec () {
  155.   int addr=ST.pop();  // System.out.println("code "+memory[addr+1]);
  156.   int ad = memory[addr];
  157.   if (ad == 1 || ad == 2 ) {    // если cfa 1 2
  158.     VM.adrStack.push(exit_addr-1);  // положить на стек возвратов адрес процедуры exit
  159.     VM.processImage(addr+1 );
  160.     }
  161.     else  
  162.  
  163.       if (ad == 0) ST.push(addr+1);  //  если 0 положить adr pfa
  164.      
  165.        else
  166.          if (ad < 0 )  {  
  167.     //  System.out.println("cfa=" + ad);
  168.        ST.push(addr+1);  //  положить adr pfa
  169.         VM.adrStack.push(exit_addr-1);
  170.        VM.processImage( -ad + 1) ; //addr+1 );
  171.        }
  172.  
  173.  
  174. }//void
  175.  
  176. public void comp  () {
  177.    int addr=ST.pop();
  178.  
  179.   if ( memory[addr] == 2 ) { // если cfa = 2
  180.               ST.push(7);      comma16();  // код команды call  
  181.           ST.push(addr+1); comma16();
  182.            }  
  183.            else  
  184.            if  (  memory[addr] == 1 ) {    
  185.                       memory [ memory[here] ] =memory[addr+1];/// !!!  _body
  186.                    //    System.out.println("here="+memory[here]+" addr="+addr+" val="+memory[addr+1]);
  187.                        memory[here]++;
  188.                }
  189.                else
  190.                
  191.  
  192.                if  (  memory[addr] < 0 )  {
  193.                  ST.push(1);      comma16();  // код команды lit  
  194.                 ST.push( addr+1 ); comma16();              
  195.                
  196.                           ST.push(7);      comma16();  // код команды call  
  197.                       int i = -memory[addr]+1;///
  198.               ST.push(i); comma16();                     
  199.             //   System.out.println(" compile " + i);
  200.                
  201.                 }
  202.                else
  203.                 if  (  memory[addr] == 0 )  {
  204.                     ST.push(1);      comma16();  // код команды lit  
  205.                             ST.push( addr+1 ); comma16();
  206.                    }
  207.                            
  208. //ST.pop();
  209.    
  210. }
  211.  
  212. public void proc() {
  213.  
  214. //   String str = WORD(test);  
  215.    // добавить тестирование пустого слова ""
  216.  //  System.out.println(" create " +str);
  217.    cre1();
  218.    ST.push(2) ; //   установить cfa = 2
  219. //   comma16();  
  220.    setCFA();
  221.    memory[state]=1; // перевод в режим компиляции
  222. }
  223.  
  224.  
  225. public void ret()  {
  226.   ST.push( VM.VM_RETURN ); //вкомпилировать return
  227.   comma16();  
  228.   memory[state]=0 ;
  229. }
  230.  
  231. public void does_() {
  232. // ST.push( VM.VM_RETURN );  // вкомпилируем ";"
  233. // comma16();  
  234.  int i = VM.adrStack.pop(); // peek();  // сохранить  со стека возвратов значение, которое занесло туда вызов does
  235.  ST.push ( -i + 1 );
  236.  setCFA();  // устанавливает отрицательный адрес cfa  
  237.  VM._HALT=true;   // остановить VM
  238.  
  239. VM.adrStack.pop(); //?????????????????????????????????  очистить стек возвратов
  240. }
  241.  
  242. public void literal() {
  243.  if (memory[state]==1) {
  244.    ST.push( FVM.VM_LIT) ;   comma16(); // compile lit
  245.    comma16();                       // compile ","
  246.    }
  247. }    
  248.  
  249. public void allot() {
  250.   memory[here]+=ST.pop();
  251. }  
  252.  
  253. public void here() {
  254.   ST.push( memory[here] );
  255. }
  256.  
  257. public void compile() {
  258.    int i = VM.adrStack.pop(); //peek();  // сохранить  со стека возвратов значение, которое занесло туда вызовc ompile()
  259. System.out.println("compile " +memory[ i+1] );
  260.    ST.push( memory[ i+1] );
  261.    comma16();
  262. VM.adrStack.push(i+1);  // обойти следущую после compile инструкцию
  263. }
  264.  
  265. public void compile2() {  // аналогично compile но компилирует инструкции с параметром , вида call addr для do loop
  266.    /*  String wrl;  // перспектив
  267.     ST.push(666); // разделитель для word  
  268.     WORD();    // на стеке 0
  269.     wrl = StrBuffer;
  270.     FIND();                // на стеке n  и
  271.     int n = ST.pop();     // снять со стека признак немедленного исполнения
  272.     if (n==0) System.out.println("слово " +  wrl + " не найдено" );
  273.       else
  274.  */    
  275. //working
  276.    int i = VM.adrStack.pop(); //peek();  // сохранить  со стека возвратов значение, которое занесло туда вызовc ompile()
  277. System.out.println("2compile " +memory[ i+1] );
  278.    ST.push( memory[ i+1] );
  279.    comma16();
  280.    ST.push( memory[ i+2] );
  281.    comma16();
  282. VM.adrStack.push(i+2);  // обойти следущую после compile инструкцию
  283. ////
  284. }
  285.  
  286. public void resolve_() {
  287.    int i = ST.pop();  //
  288.    here();
  289.  //  int m = ST.pop();
  290.    memory[i] = (short)ST.pop();
  291. //   ST.push(i);
  292. //   comma16();
  293. }
  294. public void _resolve() {
  295.   comma16();
  296. }
  297.  
  298. public void _loop_() {   //  R:ВОЗВРАТ A2:ГОАНИЧНОЕ,A1:НАЧАЛЬНОЕ
  299.  
  300. // System.out.println("yf huy 1") ;
  301.    int returnpoint = VM.adrStack.pop();
  302. // System.out.println("yf huy 2") ;  
  303.    int current =  VM.adrStack.pop();  
  304.    int end_  =   VM.adrStack.peek() ;
  305.    if (current >=end_)                        
  306.        {VM.adrStack.pop();  //del end_
  307.         VM.adrStack.pop();  // del adr for leave
  308.         VM.adrStack.push( returnpoint);
  309.         ST.push(-1);  //для ?branch
  310.          }
  311.      else
  312.      { VM.adrStack.push(  current++ ) ; System.out.println("current " + current);
  313.            VM.adrStack.push( returnpoint); System.out.println("end " +end_);
  314.             ST.push(0);  //для ?branch  
  315.       }
  316.      
  317.    /*
  318.    
  319.     //     R>  R>  R@ ( R:ВОЗВРАТ,I:ТЕКУЩЕЕ,A2:ГРАНИЧНОЕ )
  320.                                           //  -  0  1.  D+  ( R,I-A2+1,F:ПРИЗНАК ЗАВЕРШЕНИЯ )
  321.    if (current >=end_)                       // IF  ( ЗАКОНЧИТЬ )
  322.        {VM.adrStack.pop();  //del end_
  323.         VM.adrStack.pop();  // del adr for leave
  324.          VM.adrStack.push( returnpoint + 1 );  //DROP  R>  R>  2DROP  2+  ( ОБОЙТИ АДРЕС )
  325.         }
  326.     else  {//                           ( ПРОДОЛЖИТЬ )
  327.  
  328.           VM.adrStack.push(  current++ ) ;
  329. System.out.println("loop current " + current) ;      
  330.       VM.adrStack.push(    memory [ returnpoint  ] +1   );  // разыменовать ссылку за (loop)  там ук на начало цикла
  331. */
  332. //System.out.println("loop return " + memory [returnpoint] ) ;    
  333. //    }// else
  334.       /*
  335.         IF  ( ЗАКОНЧИТЬ )
  336.               DROP  R>  R>  2DROP  2+  ( ОБОЙТИ АДРЕС )
  337.  
  338.             ELSE ( ПРОДОЛЖИТЬ )
  339.               R@  +  >R  ( НОВОЕ ЗНАЧЕНИЕ СЧЕТЧИКА )
  340.               @  ( АДРЕС НАЧАЛА ТЕЛА ЦИКЛА )
  341.             THEN  >R  ;
  342.           */
  343. }
  344.  
  345. public void interpret() {
  346.  
  347.   boolean log = true;    
  348.  
  349.   while ( log ) {
  350.     String wrl;
  351.     ST.push(666); // разделитель для word  
  352.     WORD();    // на стеке 0
  353.     wrl = StrBuffer;  //  
  354.     if (wrl=="") {
  355.                  log = false;  //  достигнут конец потока
  356.                  ST.pop();  // сбросить стек после word
  357.         }
  358.               else {
  359.               FIND();                // на стеке n  и
  360.                   int n = ST.pop();     // снять со стека признак немедленного исполнения
  361.               if (n==0) {         //слово не найдено - проверить если число
  362.                    number(); //забирает со стека <адр строки> -  пока  0
  363.                    if (error != 0)  {   // если число - number оставляет 0
  364.                                log = false;
  365.                        System.out.println("слово " +  wrl + " не найдено" );
  366.                        error = 0;
  367.                        } else literal() ;
  368.                        //System.out.println("число " +  wrl + " на стеке" );
  369.                   }
  370.             else  
  371.                       if (memory[state]==0 || n==1 ) // если find вернул immediate или состояние исполнения
  372.                  exec();
  373.                   else
  374.                   comp();
  375.           }//elsefind
  376.   }// while
  377. }//interpret
  378.  
  379.  
  380. public void comment() {
  381.   boolean log = true;
  382.   while (log) {
  383.     ST.push(666); // разделитель для word  
  384.     WORD();
  385.    ST.pop();  // сброс word    
  386.     if ( StrBuffer.compareTo( ")" )==0  ) log = false;
  387.   }//while
  388. }
  389.  
  390. public void loadScr() {
  391.   File currentDir, f ;
  392.   String filePath = new File("").getAbsolutePath();
  393.   System.out.println (filePath);
  394.  
  395.   int block = ST.pop();
  396. //  VM.adrStack.push(_IN);
  397. //  VM.adrStack.push(BLK_);  
  398.  
  399.  int oldin=_IN ; int blk = BLK_;
  400. System.out.println("st depth= " +  VM.adrStack.getDepth () );
  401.  
  402.   _IN=0; // BLK_= block;
  403.  
  404.   String s=null;
  405.  
  406.   String fi = filePath+"/"+block+".f";
  407.   System.out.println("load..." + fi );
  408.  
  409.   try {
  410.    s =  readStringText(fi);
  411.    System.out.println(s);  
  412.    int i = appendData(StringVector, s) ;
  413.    BLK_=i;
  414.    System.out.println("blk_="+BLK_);
  415.    interpret();
  416.  
  417.    VM.adrStack.pop();        /////   ????/?////?????? снять со стека возвратов  --- узнать причину.
  418.  
  419.   } catch (IOException i) {s = "no file" + fi;}
  420.     catch (Exception i) {System.out.println( " erroe blk " + BLK_); }
  421.  
  422.  
  423. System.out.println("st depth after= " +  VM.adrStack.getDepth () );
  424.  
  425. //  VM.adrStack.pop();
  426.  
  427. //  BLK_=VM.adrStack.pop();
  428. //  _IN =VM.adrStack.pop();
  429. BLK_=blk; _IN= oldin;
  430.  
  431. }
  432. ////////////////////////////////////////////////////////\\\\\compile
  433.  
  434.  
  435. // from android cam
  436.  public static String readStringText(String fileName) throws IOException {
  437.     BufferedReader br = new BufferedReader(new FileReader(fileName));
  438.     String ret;
  439.     try {
  440.         StringBuilder sb = new StringBuilder();
  441.         String line = br.readLine();
  442.  
  443.         while (line != null) {
  444.             sb.append(line);
  445.             sb.append("\n");
  446.         line=null;
  447.             line = br.readLine();
  448.         }
  449.         ret = sb.toString();
  450.     } //catch (IOException io) {ret = null;}
  451.       finally {
  452.         br.close();
  453.     }
  454.     return ret;
  455.   }
  456.  
  457.  public static int writeText( String filename, String str, boolean Append) {
  458.  int ret = 0;
  459.  FileWriter writeFile = null;
  460.  try {
  461.  
  462.     File F = new File(filename);
  463.     writeFile = new FileWriter(F);
  464.     writeFile.write(str);
  465.     ret = 0;
  466.   } catch (IOException e) {
  467.     e.printStackTrace();
  468.     ret=-1;
  469.   } finally {
  470.     if(writeFile != null) {
  471.         try {
  472.             writeFile.close();
  473.         } catch (IOException e) {
  474.             e.printStackTrace();
  475.             ret = -2;
  476.         }
  477.     }//if
  478.   }  
  479.  return ret;
  480.  }//writeText
  481.  
  482. ////////////endandroidcam
  483.  
  484.  
  485. ////////////////////////////////реализация WORD//////////////////////////////////////////
  486.  
  487. public volatile int BLK_ = 0 ; // перенести в память
  488. public  int _IN=0;       // !!!!to memory
  489. public String TIB; //  строковая переменная - иммитирует tib
  490. public String StrBuffer;  //  сюда возвращает значение word и забирает find
  491.  
  492.  
  493. public static  boolean ifblank(char ch) {
  494.    boolean ret=false;
  495.    if(ch == ' ' || ch == '\n' || ch == '\t' || ch=='\r') ret = true;
  496.  return ret;  
  497.  }
  498.  
  499. static  public int skipBlank(String s, int _in) {
  500.       int position;
  501.       position=_in;
  502.       boolean log=true;
  503.       while (log)  
  504.       if ( (position)==s.length() ) {position= -1; log = false; }  // достигнут конец потока возвращает -1
  505.        else
  506.        {
  507.          if  ( ifblank( s.charAt(position))  ) position++;  else log=false;
  508.          }  //else
  509.  return position;
  510. } //endfunk
  511.    
  512.  static    public int skipUntilBlank(String s, int _in) {
  513.       int position;
  514.       position=_in;
  515.       boolean log=true;
  516.       while (log)  
  517.       if ( (position)==s.length() ) {  log = false; }  // достигнут конец  
  518.        else
  519.        {
  520.          if  ( ! ifblank( s.charAt(position))  ) position++;  else log=false; //если не бланк
  521.          }  //else
  522.  return position;
  523. } //endfunk
  524.  
  525. public   String word_( String s ) {
  526.   String w = null;
  527.   int start, ends;
  528.   start=skipBlank(s, _IN);  
  529.   if (start==-1) w=""; // достигнут конец потока, возвращает слово нулевой длинны
  530.      else {
  531.      ends=skipUntilBlank(s, start);  
  532.      _IN=ends;
  533.       w=s.substring(start,ends);  
  534.       }
  535. return w;    
  536. }  
  537.  
  538. public void WORD() {
  539.   int charBlank=ST.pop();     // !! снятие со стека blank -- пока не используется
  540.   String s=null;
  541.   if (BLK_==0) s=TIB;
  542.      else
  543.        s = (String)StringVector.elementAt(BLK_);
  544.   String si=word_(s);
  545.   StrBuffer=null; StrBuffer=si;
  546.   ST.push(0);  // если 0, то сохраняет в StrBuffer
  547. }
  548.  
  549.  
  550. public void FIND() { //поле кода   n 0 - не найдено  если не отрицательно то immediate
  551.  int ret=0;
  552.  boolean bool=false;
  553.  ST.pop(); // сброс стека, ----> 0 тут должен анализ ecли  0 то  s=StrBuffer иначе из вектора
  554.  String s=StrBuffer. toUpperCase();
  555.  
  556.   boolean immediate=false;
  557.  int tmp=memory[latest];
  558.  while (tmp != 0 && ! bool) {
  559.  immediate=false;  
  560.  int len = memory[tmp+1];
  561.  if (len<0) {immediate=true;} // если длинна слова отрицательна  - immediate=true;
  562.  int ind = memory[tmp+2]; // получаем инд в векторе           
  563.  String si = (String)StringVector.elementAt(ind);
  564.  if ( s.compareTo(si)==0) {
  565.     bool = true;    
  566.     ret=tmp+3;// memory[tmp+3]; //cfa
  567.     }                    
  568.    else
  569.    tmp=memory[tmp];
  570.  
  571.  }//while  
  572.  
  573.  ST.push(ret);
  574.  if (ret==0) ST.push(0);
  575.          else
  576.      if (   ! immediate) ST.push(-1);  
  577.        else {ST.push(1); System.out.println("immediate!!");}
  578.  
  579. }  
  580.  
  581. public String initwords =
  582. // " start " +  
  583.   " NOP 0  -1      LIT  1 -1      dup  2  -1    drop  3  -1  swap  4  -1 "+
  584.  "  >R  5  -1      R>   6 -1      CALL  7  -1    branch  8 -1   ;  9 1 " +
  585.    "  0>   10 -1   0<  11 -1       0=  12  -1     ?branch  13  -1 " +
  586.    "  @  14  -1   !  15  -1      " +
  587.   "   +  16  -1   -  17 -1   *  18  -1  /MOD  19  -1 " +
  588.   "   AND  20   -1   OR  21 -1   XOR  22  -1 SHL  23  -1  SHR  24 -1 "+
  589.   "   ZERO_EXIT  25 -1    1+  26  -1   1-  27 -1 "+
  590.   "   IN  28  -1  OUT  29 -1    WAIT  30  -1 "+
  591.  "    LIT32  31 -1  c@ 32 -1 c! 33 -1 endpart -111 -1 "+
  592. "end_ "
  593. ;  
  594.  
  595. }  //all
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top