Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //step4
- // https://anonfile.com/N9l1LeQ3n7/vm_7z
- // файл usesStack.java
- import java.util.*;
- import forth.*;
- public class usesStack {
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- System.out.println(" введите строку или end для выхода");
- //////////////////////////////////////////////STACK//////
- STACK ST,STa; // стеки данных и адресный
- ST=new STACK();
- STa=new STACK();
- int[] stackarray = new int [20];
- int[] adrstackarray = new int [20];
- int[] ports = new int[20];
- ST.stack=stackarray;
- STa.stack=adrstackarray;
- ////////////////////////////////////////
- fas as = new fas();
- as.ST=ST; // добавить стек
- as.here= 2;
- as. latest=3;
- as.state =4;
- as. memory[as.here]=6; //взято от балды
- as. memory[as.latest]=0; // записи в словари еще не создавались
- as. memory[as.state] =0; // 0 на данный момент исполнение
- Vector V=null;
- V = as.initVirtualMem(0);
- as.StringVector=V;
- FVM VM=new FVM();
- VM.stack=as.ST;
- VM.adrStack=STa;
- VM.image=as.memory;
- VM.ports=ports;
- as.VM=VM;
- VM.as=as;
- ////////////////////////////////// загрузка форт слов
- /* перенесено в fas
- public String initwords = // текст, определяющий опкоды виртуальной машины
- // " имя " op -1/1 immediate/noimmediate
- " NOP 0 -1 LIT 1 -1 DUP 2 -1 DROP 3 -1 SWAP 4 -1 "+
- " PUSH 5 -1 POP 6 -1 CALL 7 -1 JUMP 8 -1 ; 9 1 " +
- " GT_JUMP 10 -1 LT_JUMP 11 -1 NE_JUMP 12 -1 EQ_JUMP 13 -1 " +
- " FETCH 14 -1 STORE 15 -1 " +
- " + 16 -1 - 17 -1 * 18 -1 DIVMOD 19 -1 " +
- " AND 20 -1 OR 21 -1 XOR 22 -1 SHL 23 -1 SHR 24 -1 "+
- " ZERO_EXIT 25 -1 INC 26 -1 DEC 27 -1 "+
- " IN 28 -1 OUT 29 -1 WAIT 30 -1 "+
- " LIT32 31 -1 endpart -111 -1 "+
- "end_ "
- ;
- */
- String ini = as.initwords;
- as.TIB=null; as.TIB=ini;
- as._IN=0;
- boolean enddo=false; //для выхода из цикла
- do {
- /// String name = as.WORD(ini);
- int old = as._IN;
- as.ST.push(666);
- as.WORD(); // на стеке 0
- as.ST.pop(); // сброс стека
- System.out.println("added " + as.StrBuffer);
- // as.cre1();
- if (as.StrBuffer.compareTo("end_") != 0) {
- as._IN=old; // вернуть указатель в строке
- as.cre1();
- as.ST.push(666);
- as.WORD();
- as.ST.pop(); // сброс стека
- String codeString = as.StrBuffer;
- as.ST.push(666);
- as.WORD();
- as.ST.pop(); // сброс стека
- String immString = as.StrBuffer;
- int code=0;
- try { code=Integer.parseInt(codeString);} catch (Exception e){ System.out.print("num expected");}
- // int imm=0;
- // try {imm=Integer.parseInt(immString);} catch (Exception e){ System.out.print("huynia imme");}
- // boolean bool = imm>0;
- as.ST.push(code); as.comma16();
- as.ST.push(9); as.comma16(); // 9 - код операции ";" возврат из подпрограммы
- //System.out.print(name+code + " " +imm);
- }
- else enddo = true;
- } while (! enddo) ;
- ///////////////////////////////////////////
- as.TIB=null; as.TIB="EXIT . "; as._IN=0; // тут дальнейшие определения
- as.cre1(); // создается определение для exit
- as.exit_addr=as.memory[as.here];//сохранить точску входа в exit,чтобы положить на стек возвратов
- as.ST.push(1); as.comma16(); // lit
- as.ST.push(0); as.comma16(); // 0
- as.ST.push(1); as.comma16(); // lit
- as.ST.push(0); as.comma16(); // 0
- as.ST.push(29); as.comma16(); // out -- вывод в порт 0, номер фции 0 "exit"
- /*
- as.find_("EXIT");
- ST.pop(); //
- as.exit_addr=ST.pop(); //сохранить точску входа в exit,чтобы положить на стек возвратов
- */
- // определяется "."
- as.cre1();
- as.ST.push(1); as.comma16(); // lit
- as.ST.push(1); as.comma16(); // 1
- as.ST.push(1); as.comma16(); // lit
- as.ST.push(0); as.comma16(); // 0 // номер порта
- as.ST.push(29); as.comma16(); // out -- вывод в порт 0, номер фции 0 "exit"
- /////////////////////////////////////////////////////
- /*
- <адр строки> -- тут число , если ноль, то StrBuffer иначе индекс в Vector
- */
- System.out.println( "набирать DUP SWAP ... большими буквами а end для выхода маленькими" );
- as.TIB=null; as.TIB="";
- // String TIB=as.TIB; //
- while (as.TIB.compareTo("end")!=0) {
- as.TIB =null;
- as.TIB =in.nextLine();
- as._IN=0; // ! changed
- boolean log = true;
- while ( log ) {
- String st;// = as.word_(TIB);
- int old_in = as._IN;
- as.ST.push(666);
- as.WORD(); // на стеке 0
- //System.out.println("getti "+ as.StrBuffer);
- st = as.StrBuffer; // ; // ! changed
- if (st=="") { log = false; }
- else { as.FIND(); // на стеке n и
- int n = as.ST.pop(); // снять со стека признак немедленного исполнения
- // int ind = as.ST.pop(); // снять со стека cfa
- if (n==0) {
- as.number(); //забирает со стека <адр строки>
- if (as.error != 0) {
- log = false;
- System.out.println("слово " + st + " не найдено" );
- as.error = 0;
- } else System.out.println("число " + st + " на стеке" );
- }
- else {
- // int ind = as.ST.pop(); // снять со стека cfa
- as.exec();
- }
- }
- }//while log
- }//while
- printm(as.memory,0 , 8 , 25 );
- for (int k=0;k<V.size();k++) System.out.println(V.elementAt(k).toString() ) ;
- // System.out.println(as.getTypeData( V ,0 ) );
- }//main
- static void printm(short[] mem, int start , int str, int col) { //dump
- int pos=start;
- for (int l=0;l<str;l++) {
- for (int k=0;k<col;k++) {
- if (pos < mem.length )
- {System.out.print(mem [pos]+" "); pos++;
- }//endif
- }//for
- System.out.println("# \n");
- }//for
- } //void
- }//all
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement