debugging compilation
[forth.jl.git] / src / forth.jl
index 7c0fea8..940e6f3 100644 (file)
@@ -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]<mem[NUMTIB] && mem[TIB+mem[TOIN]] != delim)
+    while (mem[TOIN]<mem[NUMTIB])
         mem[addr] = mem[TIB+mem[TOIN]]
+        mem[TOIN] += 1
+
+        if (mem[addr] == delim)
+            break
+        end
+
         count += 1
         addr += 1
-        mem[TOIN] += 1
     end
 
     # Record count
@@ -781,6 +786,32 @@ WORD = defPrimWord("WORD", () -> 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]<mem[NUMTIB])
+        mem[addr] = mem[TIB+mem[TOIN]]
+        mem[TOIN] += 1
+
+        if (mem[addr] == delim)
+            break
+        end
+
+        count += 1
+        addr += 1
+    end
+
+    pushPS(addr)
+    pushPS(count)
+
+    return NEXT
+end)
+
 STATE, STATE_CFA = defNewVar("STATE", 0)
 
 INTERPRET = defWord("INTERPRET",
@@ -789,29 +820,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,
+            BTICK, LIT, COMMA, TRACE, NUMBER, COMMA, 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]
 )
 
@@ -830,13 +862,15 @@ QUIT = defWord("QUIT",
     BRANCH,-4])
 
 BYE = defPrimWord("BYE", () -> begin
+    println("Bye!")
     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