#!/bin/sh # CORMACKSCRIPT # written by daniel # # Usage: cormackscript [cmks file] [output file] # # IMPORTANT! # Place the comments: # ; CMKS START # ; CMKS END # into your racket program, the 'compiled' code will be injected here. # # For extra niceness, if you have the racket program installed it will auto execute it. # # A CormackScript file contains 3 columns separated by whitespace in the format [opcode|target|source] # Here's some sample code # # mov 20 30 # inc 1 # read 21 # print 21 # quit # # Note, for commands that only need one param you don't need to add empty columns # oh yeah, you can also comment with ; # You can redefine these to whatever you want inst0="inc" # [tt] = [tt] + 1 inst1="add" # [tt] = [tt] + [ss] inst2="sub" # [tt] = max([tt] - [ss], 0) inst3="mov" # [tt] = [ss] inst4="addeq" # [tt] = [tt] + 1, if [ss] = 0 inst5="fetch" # [tt] = [[ss]] inst6="store" # [[tt]] = [ss] inst7="print" # display [ss] inst8="read" # read [tt] inst9="quit" # halt # Config ends here =-=-=-=-=-=-=-=-= [ "$#" -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')" cat "$scriptfile" |\ sed -r "s/\s*;.*//g; /^\s*$/ d; s/\s+/ /g; s/^\s+//; s/ [0-9]{1} / 0&/; s/ [0-9]{1}\$/ 0&/; 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/ //g" |\ sed -e :a -e 's/^.\{1,4\}$/&0/;ta' |\ sed 's/![0-9]//g' >> "$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 ""