diff --git a/README.md b/README.md index 78a8ad1..86a4b3b 100755 --- a/README.md +++ b/README.md @@ -1,30 +1,11 @@ -# plc +# StreASM -| SYNTAX | DESC | -|---|---| -| NXT name, name | | -| MOV dest, src | | -| BS reg, bit, val | | -| INCR reg | | -| DECR reg | | -| ADD dest, src1, src2 | | -| SUB dest, src1, src2 | | -| MUL dest, src1, src2 | | -| DIV dest, src1, src2 | | -| AND dest, src1, src2 | | -| OR dest, src1, src2 | | -| NOR dest, src1, src2 | | -| XOR dest, src1, src2 | | -| NAND dest, src1, src2 | | -| COM dest, src1 | | -| CLR reg | | -| JMP label | | -| CALL label | | -| RET | | -| TSTZ reg, if0, ifn0 | | -| TSTE reg1, reg2, ifeq, ifneq | | -| TSTG reg1, reg2, ifg, ifng | | -| TSTGE reg1, reg2, ifge, ifnge | | -| TSTL reg1, reg2, ifl, ifnl | | -| TSTLE reg1, reg2, ifle, ifnle | | -| TSTB reg, bit, if1, if0 | | \ No newline at end of file +> A stream processing language for the criminally insane + +StreASM is a stream processing language styled after Assembly instructions. It operates on numerical inputs. + +It was created by [Daniel Lockyer](https://github.com/NeoSilky) and [Jet Holt](https://github.com/Jetroid) as part of the Programming Language Concepts module at the University of Southampton. + +The StreASM interpreter is written in OCaml using `ocamllex` and `ocamlyacc`. + +Full documentation is in the [project report](https://github.com/neosilky/StreASM/blob/master/docs/StreASMDocumentation.pdf). diff --git a/StreASMDocumentation.pdf b/docs/StreASMDocumentation.pdf similarity index 100% rename from StreASMDocumentation.pdf rename to docs/StreASMDocumentation.pdf diff --git a/spec1516.pdf b/docs/spec1516.pdf similarity index 100% rename from spec1516.pdf rename to docs/spec1516.pdf diff --git a/example/pr1.spl b/example/pr1.asm similarity index 88% rename from example/pr1.spl rename to example/pr1.asm index d8a0e9a..469e10a 100755 --- a/example/pr1.spl +++ b/example/pr1.asm @@ -9,7 +9,7 @@ main: TSTZ i0, final, @NEXT MOV o1, r1 NXT stdout, o - MOV r1, i1 ;Update the value in the buffer + MOV r1, i1 ;Update the value in the buffer JMP main ;Loop final: diff --git a/example/pr10.spl b/example/pr10.asm old mode 100644 new mode 100755 similarity index 97% rename from example/pr10.spl rename to example/pr10.asm index 1511124..f4d9e28 --- a/example/pr10.spl +++ b/example/pr10.asm @@ -1,6 +1,6 @@ ;Delayed Feedback ;Take a sequence a1 a2 a3 a4 a5 ... as an input -;and output +;and output ;a1 ;a2 ;a3 + (a1) diff --git a/example/pr10input b/example/pr10input old mode 100644 new mode 100755 diff --git a/example/pr2.spl b/example/pr2.asm similarity index 100% rename from example/pr2.spl rename to example/pr2.asm diff --git a/example/pr3.spl b/example/pr3.asm similarity index 100% rename from example/pr3.spl rename to example/pr3.asm diff --git a/example/pr4.spl b/example/pr4.asm similarity index 100% rename from example/pr4.spl rename to example/pr4.asm diff --git a/example/pr5.spl b/example/pr5.asm similarity index 100% rename from example/pr5.spl rename to example/pr5.asm diff --git a/example/pr6.spl b/example/pr6.asm old mode 100644 new mode 100755 similarity index 100% rename from example/pr6.spl rename to example/pr6.asm diff --git a/example/pr6input b/example/pr6input old mode 100644 new mode 100755 diff --git a/example/pr7.spl b/example/pr7.asm old mode 100644 new mode 100755 similarity index 100% rename from example/pr7.spl rename to example/pr7.asm diff --git a/example/pr7input b/example/pr7input old mode 100644 new mode 100755 diff --git a/example/pr8.spl b/example/pr8.asm old mode 100644 new mode 100755 similarity index 100% rename from example/pr8.spl rename to example/pr8.asm diff --git a/example/pr8input b/example/pr8input old mode 100644 new mode 100755 diff --git a/example/pr9.spl b/example/pr9.asm old mode 100644 new mode 100755 similarity index 100% rename from example/pr9.spl rename to example/pr9.asm diff --git a/example/pr9input b/example/pr9input old mode 100644 new mode 100755 diff --git a/group.txt b/group.txt deleted file mode 100755 index 5bcdeed..0000000 --- a/group.txt +++ /dev/null @@ -1,2 +0,0 @@ -Daniel Lockyer 26785501 dl6g14@soton.ac.uk 50 -Jet Holt 26753022 jh17g14@soton.ac.uk 50 \ No newline at end of file diff --git a/interpreter.zip b/interpreter.zip deleted file mode 100644 index 87ac0b2..0000000 Binary files a/interpreter.zip and /dev/null differ diff --git a/make.sh b/make.sh deleted file mode 100755 index 61a4db9..0000000 --- a/make.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -rm interpreter.zip - -#Make our interpreter from scratch -cd src/ && make clean && zip -r ../interpreter.zip . - -cd ../example && zip -r ../interpreter.zip ./pr*.spl - -cd ../ && zip -r interpreter.zip ./group.txt diff --git a/make2.sh b/make2.sh deleted file mode 100755 index 06147f6..0000000 --- a/make2.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -rm solutionsAndManual.zip - -zip -r solutionsAndManual.zip ./group.txt ./StreASMDocumentation.pdf - -cd example && zip -r ../solutionsAndManual.zip ./pr{6,7,8,9,10}.spl diff --git a/solutionsAndManual.zip b/solutionsAndManual.zip deleted file mode 100644 index 89554bf..0000000 Binary files a/solutionsAndManual.zip and /dev/null differ diff --git a/src/Streasm.ml b/src/Streasm.ml index d2a6404..a16854a 100755 --- a/src/Streasm.ml +++ b/src/Streasm.ml @@ -18,7 +18,7 @@ exception Interpreter_error;; let throw_error_aux error msg = (print_endline ("[ " ^ (Printexc.to_string error) ^ " - line " ^ (string_of_int !index) ^ " ] " ^ msg); raise error;);; let throw_error msg = throw_error_aux Interpreter_error msg;; -let map_label (label: string) (line: int) = +let map_label (label: string) (line: int) = if label <> "" then if Hashtbl.mem labels label then if Hashtbl.find labels label = line then () @@ -33,10 +33,10 @@ let rec find_label_aux (label: string) (index: int) = else find_label_aux label (index + 1) else throw_error ("Label " ^ label ^ " not defined") -let find_label (label: string) = - if Hashtbl.mem labels label then Hashtbl.find labels label +let find_label (label: string) = + if Hashtbl.mem labels label then Hashtbl.find labels label else find_label_aux label !index - + let get_name_binding (name: string) = if Hashtbl.mem renamings name then Hashtbl.find renamings name else throw_error ("The naming " ^ name ^ " is undefined at instruction " ^ (string_of_int !index)) @@ -78,8 +78,8 @@ let clean_regname (register: string) = (ident ^ (string_of_int (lookup number))) else throw_error ("Expected a register, received '" ^ register ^ "'") - -let bind_value (register: string) (value: int) = + +let bind_value (register: string) (value: int) = if ((Str.string_match (Str.regexp regex_reg) register 0) || (Str.string_match (Str.regexp regex_nreg) register 0)) then Hashtbl.replace registers (clean_regname register) value else if Str.string_match (Str.regexp regex_str) register 0 then @@ -93,7 +93,7 @@ let rename (new_name: string) (register: string) = else throw_error ("Expected a register, received '" ^ register ^ "'") -let instr_jmp (label: string) = +let instr_jmp (label: string) = if label = "@END" then running := false else if label = "@NEXT" then () else index := find_label label @@ -112,7 +112,7 @@ let instr_bs (register: string) (pos: int) (v: int) = let instr_ret () = match !return_stack with [] -> running := false | head::rest -> (index := head; return_stack := rest) - + let get_string (ident: string) = try let line = read_line() in let split = Str.split (Str.regexp " ") line in @@ -131,12 +131,12 @@ let rec make_string (ident: string) (target: int) (found: int) (position: int) = Hashtbl.remove registers register; make_string ident target (found + 1) (position + 1)) else make_string ident target found (position + 1) - else () + else () else if target <> 0 then throw_error ("Did not find " ^ (string_of_int target) ^ " values within 1024 indexes of " ^ ident) else () - -let instr_nxt (iden1: string) (iden2: string) = + +let instr_nxt (iden1: string) (iden2: string) = if iden2 = "stdin" then if Str.string_match (Str.regexp regex_char) iden1 0 then get_string iden1 @@ -195,4 +195,4 @@ let interpret (input: string array array) = | "DEF" -> rename p1 p2 | _ -> throw_error ("Unknown Instruction: \"" ^ instruction ^ "\"") with _ as e -> throw_error_aux e "An error occurred when interpreting the file"); - done);; \ No newline at end of file + done);; diff --git a/src/lexer.mll b/src/lexer.mll index 7f9d283..dbd2300 100755 --- a/src/lexer.mll +++ b/src/lexer.mll @@ -2,7 +2,7 @@ open Lexing open Parser exception Syntax_error of string - + let instructionPointer = ref 1;; let syntax_error lexbuf = raise (Syntax_error ("Couldn't identify the token on line " ^ (string_of_int !instructionPointer) ^ " with token \"" ^ (Lexing.lexeme lexbuf) ^ "\""));; } @@ -21,7 +21,7 @@ rule lexer_main = parse | literal as d { LITERAL (d) } | register as r { REGISTER (r) } | comment { lexer_main lexbuf } - | alpha as a { IDENTIFIER (Char.escaped a) } + | alpha as a { IDENTIFIER (Char.escaped a) } | "," { COMMA } | ":" { COLON } | "ADD" { INSTR_ADD } diff --git a/src/mysplinterpreter.ml b/src/mysplinterpreter.ml index 6cc2f4c..42c7220 100755 --- a/src/mysplinterpreter.ml +++ b/src/mysplinterpreter.ml @@ -4,9 +4,9 @@ open Parser open Arg open Printf -let parseProgram c = +let parseProgram c = let lexbuf = Lexing.from_channel c in - try + try let parsed = parser_main lexer_main lexbuf in interpret parsed with Parsing.Parse_error -> diff --git a/src/parser.mly b/src/parser.mly index 5ab6fe9..0437693 100755 --- a/src/parser.mly +++ b/src/parser.mly @@ -1,6 +1,5 @@ -%{ +%{ let instructions = ref [];; - let add_line (label: string) (instr: string list) = instructions := Array.of_list (label :: instr) :: !instructions;; let add_instr instr p1 p2 p3 p4 = instr :: p1 :: p2 ::p3 :: p4 :: [];; %} @@ -48,7 +47,7 @@ eol | EOL { } ; -tab +tab : tab TAB { } | TAB { } ;