SHARE
TWEET

step4 as

vikt144 Jan 27th, 2020 3 in 205 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //step4
  2.  
  3. // file    forth/fas.java
  4. package forth;
  5.  
  6.    
  7. import java.util.*;
  8. import java.lang.*;
  9.  
  10. public class fas {
  11.  
  12.   public STACK ST;
  13.   public FVM VM;
  14.  
  15. /// vector and crea
  16.  
  17. public   static int here;  // адрес переменной HERE в массиве memory
  18. public   static int latest; // адрес переменной LATEST в массиве memory
  19. public   static int state;
  20. // static
  21.  public short[] memory = new short[1000];  //выделяем память из 16 битных целых размером в 1000
  22.  
  23.  public int exit_addr;  //адрес процедуры выхода
  24.  
  25. //////////////////////////////////////////////////////////  vectors
  26. public  Vector StringVector;
  27.  
  28. public Vector initVirtualMem(int i) {
  29.  Vector v = new Vector();
  30.  Integer I = new Integer(i);  // тип Integer, это объектное представление типа int
  31.  v.addElement(I);  
  32.  return v;
  33. }
  34.  
  35.  
  36. public int appendData(Vector v,Object obj) {
  37.  
  38.     Integer  Ind = (Integer)v.elementAt(0);   // получить значение начального элемента вектора как Integer
  39.     int ind = Ind.intValue();                      // преобразовать в нормальный int
  40.    
  41.     if ( ind == 0) {                                  // если равен 0, то свободных элементов нет
  42.       v.addElement(obj);//                    // тогда добавляем объект  к вектору
  43.       ind=v.size()-1;
  44.       }
  45.         else {
  46.           Integer I =( Integer)v.elementAt(ind);  // иначе ind указывает на свободный элемент (СЭ)
  47.           int i = I.intValue();                                //там хранится предыдущий  (СЭ) который получаем
  48.     v.setElementAt(obj, ind);                  // Замещаем элемент вектора с номером ind объектом obj
  49.     v.setElementAt(I, 0);                    // в начальный элемент вектора пишем предыдущий  СЭ
  50.           }
  51.  
  52.   return ind;          // возвращаем индекс объекта в векторе
  53. }
  54.  
  55.   public int removeData (Vector v, int ind){
  56.     int ret = 0;
  57.     if ( ind>v.size()-1) return  -1 ;
  58.     if (getTypeData( v, ind).compareTo("java.lang.Integer")==0 )  return  -2 ;
  59.      
  60.     if ( ind==v.size()-1) v.removeElementAt(ind) ;
  61.       else {
  62.            v.setElementAt(null, ind);
  63.            Integer IndOld=(Integer)v.elementAt(0); // получить предыдущее знач 0 элемента
  64.            int ind_=IndOld.intValue();  
  65.            v.setElementAt(IndOld, ind);     // записать его в элемент который на удаление
  66.            Integer IndNew = new Integer(ind);
  67.            v.setElementAt(IndNew, 0);   // 0 элемент указывает на новый        
  68.     }        
  69.   return ret;
  70.   }
  71.  
  72. public String getStringv(Vector v, int ind){
  73.   return (String)v.elementAt(ind);
  74. }
  75.  
  76. public String getTypeData( Vector v, int ind){
  77. return  v.elementAt(ind) . getClass().getName() ;
  78. }
  79.  
  80. // link strsize nomberVector
  81.  
  82. ////////////////////////////////////////////////////////////////////////////////////
  83.  
  84.  
  85. /*
  86.  public  void cre0 (String s) {   // временная вспомогательная ф-ция. создающая упрощенную запись в словаре
  87.   short tmp = memory[here]; //получить here
  88.   memory[tmp]=memory[latest];
  89.   memory[latest]=tmp;
  90.   tmp++;
  91.   int i = s.length();    // получаем длинну строки
  92. //  if (immediate)  i=0-i; // если immediate , число отрицательно, (временно для простоты)
  93.   memory[tmp]= (short)i;
  94.   tmp++;  
  95.   i=appendData(StringVector, s);
  96.   memory[tmp]= (short)i;  
  97.   tmp++;
  98.   memory[here]=tmp;  //устанавливается новое значение here
  99. }
  100. */
  101.  
  102. public void comma16() {  // эквивалентно запятая "," только снимает 16 bit
  103.   short i = (short)ST.pop();
  104.   int adr = memory[here];
  105.   memory[adr]=i;
  106.   memory[here]++;
  107. }
  108.  
  109.  public  void cre1() { // (String s) {   // временная вспомогательная ф-ция. создающая упрощенную запись в словаре
  110.   ST.push(666);  // код бланк для word - пока не используется
  111.   WORD();
  112.   ST.pop();            // сброс стека, world пока возвращает только 0
  113.   String s=StrBuffer; // реализовать проверку на ""  //
  114.  
  115.   short tmp = memory[here]; //получить here
  116.   ST.push(memory[latest] );
  117.   comma16();
  118.   memory[latest]=tmp;  
  119.  
  120.   ST.push( s.length() );
  121.   comma16();
  122.   ST.push( appendData(StringVector, s) ); //appendData возвращает индекс на строку
  123.   comma16();
  124.   ST.push(999);
  125.   comma16();
  126. }
  127.  
  128. public void setCFA() {
  129.   int i = ST.pop();     // снять со стека нужное значение cfa
  130.   memory[latest+3] = (short)i;    
  131. }
  132.  
  133. public int error = 0;
  134.  
  135. public void number() {  
  136.   int ind = ST.pop(); // снять адр строки
  137.   String s = StrBuffer;
  138.   int ii;
  139.   try {ii = Integer.parseInt(s);
  140.        ST.push(ii);
  141.       } catch (Exception e) {error=-1; }
  142.  
  143. }
  144.  
  145.  
  146. public void exec () {
  147.  int addr=ST.pop();
  148.  
  149.  VM.adrStack.push(exit_addr-1);  // положить на стек возвратов адрес процедуры exit
  150.  
  151.  VM.processImage(addr+1 );
  152.  
  153. }
  154.  
  155.  
  156. ////////////////////////////////реализация WORD//////////////////////////////////////////
  157.  
  158. public int BLK_ = 0 ; // перенести в память
  159. public  int _IN=0;       // !!!!to memory
  160. public String TIB; //  строковая переменная - иммитирует tib
  161. public String StrBuffer;  //  сюда возвращает значение word и забирает find
  162.  
  163.  
  164. public static  boolean ifblank(char ch) {
  165.    boolean ret=false;
  166.    if(ch == ' ' || ch == '\n' || ch == '\t' || ch=='\r') ret = true;
  167.  return ret;  
  168.  }
  169.  
  170. static  public int skipBlank(String s, int _in) {
  171.       int position;
  172.       position=_in;
  173.       boolean log=true;
  174.       while (log)  
  175.       if ( (position)==s.length() ) {position= -1; log = false; }  // достигнут конец потока возвращает -1
  176.        else
  177.        {
  178.          if  ( ifblank( s.charAt(position))  ) position++;  else log=false;
  179.          }  //else
  180.  return position;
  181. } //endfunk
  182.    
  183.  static    public int skipUntilBlank(String s, int _in) {
  184.       int position;
  185.       position=_in;
  186.       boolean log=true;
  187.       while (log)  
  188.       if ( (position)==s.length() ) {  log = false; }  // достигнут конец  
  189.        else
  190.        {
  191.          if  ( ! ifblank( s.charAt(position))  ) position++;  else log=false; //если не бланк
  192.          }  //else
  193.  return position;
  194. } //endfunk
  195.  
  196. public   String word_( String s ) {
  197.   String w = null;
  198.   int start, ends;
  199.   start=skipBlank(s, _IN);  
  200.   if (start==-1) w=""; // достигнут конец потока, возвращает слово нулевой длинны
  201.      else {
  202.      ends=skipUntilBlank(s, start);  
  203.      _IN=ends;
  204.       w=s.substring(start,ends);  
  205.       }
  206. return w;    
  207. }  
  208.  
  209. public void WORD() {
  210.   int charBlank=ST.pop();     // !! снятие со стека blank -- пока не используется
  211.   String s=null;
  212.   if (BLK_==0) s=TIB;
  213.      else
  214.        s = (String)StringVector.elementAt(BLK_);
  215.   String si=word_(s);
  216.   StrBuffer=null; StrBuffer=si;
  217.   ST.push(0);  // если 0, то сохраняет в StrBuffer
  218. }
  219.  
  220.  
  221. public void FIND() { //поле кода   n 0 - не найдено  если не отрицательно то immediate
  222.  int ret=0;
  223.  boolean bool=false;
  224.  ST.pop(); // сброс стека, ----> 0 тут должен анализ ecли  0 то  s=StrBuffer иначе из вектора
  225.  String s=StrBuffer;
  226.  
  227.   boolean immediate=false;
  228.  int tmp=memory[latest];
  229.  while (tmp != 0 && ! bool) {
  230. // immediate=false;  
  231.  int len = memory[tmp+1];
  232. // if (len<0) {immediate=true;} // если длинна слова отрицательна  - immediate=true;
  233.  int ind = memory[tmp+2]; // получаем инд в векторе           
  234.  String si = (String)StringVector.elementAt(ind);
  235.  if ( s.compareTo(si)==0) {
  236.     bool = true;    
  237.     ret=tmp+3;// memory[tmp+3]; //cfa
  238.     }                    
  239.    else
  240.    tmp=memory[tmp];
  241.  
  242.  }//while  
  243.  
  244.  ST.push(ret);
  245.  if (ret==0) ST.push(0);
  246.          else
  247.      if (   ! immediate) ST.push(-1);
  248.        else ST.push(1);
  249.  
  250. }  
  251.  
  252. public String initwords =
  253. // " start " +  
  254.   " NOP 0  -1      LIT  1 -1      DUP  2  -1    DROP  3  -1  SWAP  4  -1 "+
  255.  "     PUSH  5  -1    POP  6 -1      CALL  7  -1    JUMP  8 -1   ;  9 1 " +
  256.    "  GT_JUMP   10 -1 LT_JUMP  11 -1  NE_JUMP  12  -1     EQ_JUMP  13  -1 " +
  257.    "  FETCH  14  -1   STORE  15  -1      " +
  258.   "   +  16  -1   -  17 -1   *  18  -1 DIVMOD  19  -1 " +
  259.   "   AND  20   -1   OR  21 -1   XOR  22  -1 SHL  23  -1  SHR  24 -1 "+
  260.   "   ZERO_EXIT  25 -1    INC  26  -1   DEC  27 -1 "+
  261.   "   IN  28  -1  OUT  29 -1    WAIT  30  -1 "+
  262.  "    LIT32  31 -1  endpart -111 -1 "+
  263. "end_ "
  264. ;  
  265.  
  266. }  //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