X-Git-Url: https://git.danieliu.xyz/?p=dotfiles.git;a=blobdiff_plain;f=Scripts%2Fcormackscript;h=9f7cc728e616c85f7b3aed948e5c413483e8d139;hp=062646e648b9b4fad6411ddd5f740687aa4c732c;hb=bb16cdd8187a06a71fb5b3b3afe8c3c9ad3b81a3;hpb=1c02965f97c95ebf640bf869fc22d052e69a8024 diff --git a/Scripts/cormackscript b/Scripts/cormackscript index 062646e..9f7cc72 100755 --- a/Scripts/cormackscript +++ b/Scripts/cormackscript @@ -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 ""