X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=3305d5e9e46104854b9b36ffdf553f3e898eca58;hb=fca502cc9896f8289b80f20d515f2adbf88ce6a0;hp=7c0fea8b35b4dd6ef011aa49c16f62f24768df6f;hpb=dc5ec6fb1faceb5aa0e50e485491bfca08a18b1e;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index 7c0fea8..3305d5e 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -679,7 +679,7 @@ TOCFA = defPrimWord(">CFA", () -> begin return NEXT end) -TODFA = defWord(">DFA", [TOCFA, INCR, EXIT]) +TOPFA = defWord(">PFA", [TOCFA, INCR, EXIT]) # Branching @@ -767,11 +767,16 @@ WORD = defPrimWord("WORD", () -> begin # Start reading in word count = 0 - while (mem[TOIN] begin return NEXT end) +PARSE = defPrimWord("PARSE", () -> begin + delim = popPS() + + # Chew up initial occurrences of delim + addr = mem[HERE] + + # Start reading input stream + count = 0 + while (mem[TOIN] begin + println("Bye!") + return 0 +end) + STATE, STATE_CFA = defNewVar("STATE", 0) INTERPRET = defWord("INTERPRET", @@ -789,29 +825,30 @@ INTERPRET = defWord("INTERPRET", DUP, FETCH, ZE, ZBRANCH, 3, DROP, EXIT, # Exit if TIB is exhausted - STATE_CFA, FETCH, ZBRANCH, 27, + STATE_CFA, FETCH, ZBRANCH, 32, # Compiling - DUP, FIND, ZBRANCH, 17, + DUP, FIND, QDUP, ZBRANCH, 19, # Found word. + SWAP, DROP, DUP, TOCFA, SWAP, INCR, FETCH, LIT, F_IMMED, AND, ZBRANCH, 4, # Immediate: Execute! - EXECUTE, BRANCH, -30, + EXECUTE, BRANCH, -33, # Not immediate: Compile! - COMMA, BRANCH, -33, + COMMA, BRANCH, -36, # No word found, parse number - NUMBER, BTICK, LIT, COMMA, BRANCH, -39, + NUMBER, BTICK, LIT, COMMA, COMMA, TRACE, BRANCH, -44, # Interpreting - DUP, FIND, ZBRANCH, 5, + DUP, FIND, QDUP, ZBRANCH, 7, # Found word. Execute! - TOCFA, EXECUTE, BRANCH, -47, + SWAP, DROP, TOCFA, EXECUTE, BRANCH, -55, # No word found, parse number and leave on stack - NUMBER, BRANCH, -50, + NUMBER, BRANCH, -58, EXIT] ) @@ -829,14 +866,11 @@ QUIT = defWord("QUIT", INTERPRET, PROMPT, BRANCH,-4]) -BYE = defPrimWord("BYE", () -> begin - return 0 -end) - INCLUDE = defPrimWord("INCLUDE", () -> begin + pushPS(32) callPrim(mem[WORD]) - wordLen = popPS() - wordAddr = popPS() + wordAddr = popPS()+1 + wordLen = mem[wordAddr-1] word = getString(wordAddr, wordLen) push!(sources, open(word, "r")) @@ -850,7 +884,6 @@ end) # Compilation HEADER = defPrimWord("HEADER", () -> begin - wordAddr = popPS()+1 wordLen = mem[wordAddr-1] word = getString(wordAddr, wordLen) @@ -877,13 +910,13 @@ HIDDEN = defPrimWord("HIDDEN", () -> begin end) HIDE = defWord("HIDE", - [WORD, + [LIT, 32, WORD, FIND, HIDDEN, EXIT]) COLON = defWord(":", - [WORD, + [LIT, 32, WORD, HEADER, LIT, DOCOL, COMMA, LATEST_CFA, FETCH, HIDDEN, @@ -903,7 +936,7 @@ IMMEDIATE = defPrimWord("IMMEDIATE", () -> begin end, flags=F_IMMED) TICK = defWord("'", - [WORD, FIND, TOCFA, EXIT]) + [LIT, 32, WORD, FIND, TOCFA, EXIT]) #### VM loop #### @@ -938,25 +971,25 @@ function run(;initialize=false) # Everyting else is simply a consequence of this loop! jmp = NEXT while jmp != 0 -# try - println("Entering prim $(getPrimName(jmp))") + try + #println("Entering prim $(getPrimName(jmp))") jmp = callPrim(jmp) -# catch ex -# showerror(STDOUT, ex) -# println() -# -# while !isempty(sources) && currentSource() != STDIN -# close(pop!(sources)) -# end -# -# mem[STATE] = 0 -# mem[NUMTIB] = 0 -# reg.PSP = mem[PSP0] -# reg.RSP = mem[RSP0] -# reg.IP = QUIT + 1 -# jmp = NEXT -# end + catch ex + showerror(STDOUT, ex) + println() + + while !isempty(sources) && currentSource() != STDIN + close(pop!(sources)) + end + + mem[STATE] = 0 + mem[NUMTIB] = 0 + reg.PSP = mem[PSP0] + reg.RSP = mem[RSP0] + reg.IP = QUIT + 1 + jmp = NEXT + end end end