X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;ds=sidebyside;f=Scripts%2Fcormackscript;h=f6bdf336bd3b7620a1e6e9f6c5a8577e13996b65;hb=ea647b01ed4784be06204090b3042f51a8267f70;hp=ed12e5770029b6b55067da3353302d3de25bb9e4;hpb=1e538d57480c7eba19393a8b365f662bf0a6dfb5;p=dotfiles.git diff --git a/Scripts/cormackscript b/Scripts/cormackscript index ed12e57..f6bdf33 100755 --- a/Scripts/cormackscript +++ b/Scripts/cormackscript @@ -1,30 +1,29 @@ #!/bin/sh -# CORMACKSCRIPT General Syntax +# 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 +# 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 # -# Example: -# -# A CormackScript file contains 3 columns separated by whitespace in the format -# opcode target source -# -# -# -# You can comment with ; -# +# mov 20 30 +# inc 1 +# read 21 +# print 21 +# quit # -# Sample code -# -# - -scriptfile="A12d.cmks" # cormackscript file -targetfile="A12d.rkt" # destination file +# 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 @@ -32,34 +31,26 @@ inst0="inc" # [tt] = [tt] + 1 inst1="add" # [tt] = [tt] + [ss] inst2="sub" # [tt] = max([tt] - [ss], 0) inst3="mov" # [tt] = [ss] -inst4="" # [tt] = [tt] + 1, if [ss] = 0 -inst5="" # [tt] = [[ss]] -inst6="" # [[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 =-=-=-=-=-=-=-=-= -sub() { - cat "$scriptfile" |\ - sed 's/\s*;.*//g; /^\s*$/ d;' |\ - sed "s/$inst0/0/" - - # finally removes any non alphanumerics in case sm breaks -} +[ "$#" -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; } -inject() { - tmp="$(mktemp 'tempXXX')" - sub >> "$tmp" - sed -i "/\; CMKS START/,/\; CMKS END/{/\; CMKS START/!{/\; CMKS END/!d}}; /\; CMKS START/r $tmp" "$targetfile" - rm "$tmp" -} - - -[ -f "$scriptfile" ] && [ -f "$targetfile" ] || { echo "You are missing a file, please check that the current directory contains $scriptfile and $targetfile" && 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" - -inject +[ ! -z "$(command -v racket)" ] && racket "$targetfile" && echo ""