cmks
[dotfiles.git] / Scripts / cormackscript
index 062646e..9f7cc72 100755 (executable)
@@ -3,32 +3,43 @@
 # CORMACKSCRIPT 
 # written by daniel
 #
+# Usage: cormackscript [cmks file] [output file]
+#
 # IMPORTANT!
-# Make sure you change the 'scriptfile' and 'targetfile' variables as you see fit.
-# In addition, place the comments:
+# Place the comments (important to get spaces right too):
 # ; CMKS START
 # ; CMKS END
-# into your racket program, the 'compiled' code will be injected here.
+# into your racket program, the 'assembled' code will be injected here.
 #
-# For extra niceness, if you have the racket program installed it will auto execute it.
+# For extra niceness, if you have the racket program installed it will auto execute it your file.
 #
 # A CormackScript file contains 3 columns separated by whitespace in the format [opcode|target|source]  
+# - The inc, print and read instructions read from the first column
+# - The quit instruction can be standalone
+# - you can comment with ;
+# - extraneous whitespace is ignored
+#
 # Here's some sample code
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+# ; setting up memory
+# 6     ; [0]: first instruction
+# 1     ; [1]: literal 1
+# 2     ; [2]: literal 2
+# 7     ; [3]: literal 7
+# 0     ; [4]: n
+# 0     ; [5]: acc
 #
-# mov 20 30
-# inc 01
-# read 21
-# print 21
+# ; actual instructions 
+# read 4 ; input n
+# addeq 00 4 ; skip next if n = 0
+# add 00 2 ; skip next 2 instructions
+# print 5 ; out acc
 # quit
+# add 05 04 ; acc = acc + n
+# sub 04 01 ; n = n - 1
+# sub 00 03 ; go back 7 (from next instr)
+# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 #
-# Note, for commands that only need one param you don't need to add empty columns
-# However, you do need leading zeros (you must put 01 not 1)
-#
-# oh yeah, you can comment with ;
-
-scriptfile="A12d.cmks" # cormackscript file
-targetfile="A12d.rkt" # destination file
-
 # You can redefine these to whatever you want
 
 inst0="inc"   # [tt] = [tt] + 1
@@ -44,19 +55,28 @@ inst9="quit"  # halt
 
 # Config ends here =-=-=-=-=-=-=-=-=
 
-sub() {
-    cat "$scriptfile" |\
-        sed -r "s/\s*;.*//g; /^\s*$/ d; s/$inst0/0/; s/$inst1/1/; s/$inst2/2/; s/$inst3/3/; s/$inst4/4/; s/$inst5/5/; s/$inst6/6/; s/$inst7/700/; s/$inst8/8/; s/$inst9/9/; s/\s+//g" |\
-        sed -e :a -e 's/^.\{1,4\}$/&0/;ta' |\
-        sed 's/![0-9]//g'
-}
-
-[ -f "$scriptfile" ] && [ -f "$targetfile" ] || { echo "You are missing a file, please check that the current directory contains $scriptfile and $targetfile" && exit 1; }
-
-# If racket is installed run it directly
-[ ! -z "$(command -v racket)" ] && racket "$targetfile" && echo ""
+[ "$#" -ne 2 ] && { echo "Usage: cormackscript [cmks file] [output file]" && exit 1; }
+scriptfile="$1"; targetfile="$2"
+[ -f "$scriptfile" ] && [ -f "$targetfile" ] || { echo "Either $scriptfile or $targetfile do not exist" && exit 1; }
 
 tmp="$(mktemp 'tempXXX')"
-sub >> "$tmp"
+cat "$scriptfile" |\
+    sed -r "s/\s*;.*//g; /^\s*$/ d; s/\s+/ /g; s/^\s+//" |\
+        awk "
+                /^$inst0\s/ {printf \"0%02d00 ; [%02d] = [%02d] + 1\n\",\$2,\$2,\$2}
+                /^$inst1\s/ {printf \"1%02d%02d ; [%02d] = [%02d] + [%02d]\n\",\$2,\$3,\$2,\$2,\$3}
+                /^$inst2\s/ {printf \"2%02d%02d ; [%02d] = max([%02d] - [%02d], 0)\n\",\$2,\$3,\$2,\$2,\$3}
+                /^$inst3\s/ {printf \"3%02d%02d ; [%02d] = [%02d]\n\",\$2,\$3,\$2,\$3}
+                /^$inst4\s/ {printf \"4%02d%02d ; [%02d] = [%02d] + 1, if [%02d] = 0\n\",\$2,\$3,\$2,\$2,\$3}
+                /^$inst5\s/ {printf \"5%02d%02d ; [%02d] = [[%02d]]\n\",\$2,\$3,\$2,\$3}
+                /^$inst6\s/ {printf \"6%02d%02d ; [[%02d]] = [%02d]\n\",\$2,\$3,\$2,\$3}
+                /^$inst7\s/ {printf \"700%02d ; display [%02d]\n\",\$2,\$2}
+                /^$inst8\s/ {printf \"8%02d00 ; read [%02d]\n\",\$2,\$2}
+                /^$inst9/ {print \"90000 ; halt\"}
+                !/^$inst0\s|^$inst1\s|^$inst2\s|^$inst3\s|^$inst4\s|^$inst5\s|^$inst6\s|^$inst7\s|^$inst8\s|^$inst9/
+            " >> "$tmp"
 sed -i "/\; CMKS START/,/\; CMKS END/{/\; CMKS START/!{/\; CMKS END/!d}}; /\; CMKS START/r $tmp" "$targetfile"
 rm "$tmp"
+
+# If racket is installed run it directly
+[ ! -z "$(command -v racket)" ] && racket "$targetfile" && echo ""