Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (*
- Created by Bradley Kovacs
- COP 4020 - Summer 2016
- Homework 4 - CAM VM
- *)
- let addOne v =
- v := !v + 1
- ;;
- let subtractOne v =
- v := !v - 1
- ;;
- let maxStackHeight = ref 1000;;
- let maxMemLength = ref 1000;;
- let maxCodeLength = ref 1000;;
- let stack = Array.make !maxStackHeight 0;;
- let mem = Array.make !maxMemLength 0;;
- let code = Array.make !maxCodeLength 0;;
- let sr = ref 0;;
- let mr = ref 0;;
- let cr = ref 0;;
- let load v =
- Array.set stack !sr v
- ;;
- let quote v =
- addOne sr;
- Array.set stack !sr v
- ;;
- let cur l =
- addOne sr;
- Array.set stack !sr l
- ;;
- let dupl () =
- let ele = stack.(!sr) in
- Array.set stack (!sr + 1) ele;
- addOne sr
- ;;
- let swap () =
- let temp1 = stack.(!sr - 1) in
- let temp2 = stack.(!sr) in
- Array.set stack !sr temp1;
- Array.set stack (!sr - 1) temp2
- ;;
- let rot () =
- let temp1 = stack.(!sr - 1) in
- let temp2 = stack.(!sr - 2) in
- let temp3 = stack.(!sr) in
- Array.set stack !sr temp1;
- Array.set stack (!sr - 1) temp2;
- Array.set stack (!sr - 2) temp3
- ;;
- let irot () =
- let temp1 = stack.(!sr - 2) in
- let temp2 = stack.(!sr) in
- let temp3 = stack.(!sr - 1) in
- Array.set stack !sr temp1;
- Array.set stack (!sr - 1) temp2;
- Array.set stack (!sr - 2) temp3
- ;;
- let plus () =
- let temp1 = stack.(!sr) in
- let temp2 = stack.(!sr - 1) in
- let sum = temp1 + temp2 in
- Array.set stack (!sr - 1) sum;
- subtractOne sr
- ;;
- let mult () =
- let temp1 = stack.(!sr) in
- let temp2 = stack.(!sr - 1) in
- let product = temp1 * temp2 in
- Array.set stack (!sr - 1) product;
- subtractOne sr
- ;;
- let fst () =
- let ele = stack.(!sr) in
- let memEle = mem.(ele) in
- Array.set stack !sr memEle
- ;;
- let snd () =
- let ele = stack.(!sr) in
- let memEle = mem.(ele + 1) in
- Array.set stack !sr memEle
- ;;
- let setfst () =
- let idx = stack.(!sr - 1) in
- Array.set mem idx stack.(!sr);
- subtractOne sr
- ;;
- let setsnd () =
- let idx = (stack.(!sr - 1) + 1) in
- Array.set mem idx stack.(!sr);
- subtractOne sr
- ;;
- let cons () =
- Array.set mem !mr stack.(!sr);
- let ele = stack.(!sr - 1) in
- Array.set mem (!mr + 1) ele;
- Array.set stack (!sr - 1) !mr;
- addOne mr;
- addOne mr;
- subtractOne sr
- ;;
- let split () =
- let ele = mem.(stack.(!sr)) in
- Array.set stack (!sr + 1) ele;
- let ele2 = mem.(stack.(!sr) + 1) in
- Array.set stack !sr ele2;
- subtractOne sr
- ;;
- let branch a1 a2 =
- Array.set stack (!sr) (if stack.(!sr) == 1 then a1 else a2)
- ;;
- let app () =
- let temp = stack.(!sr) in
- Array.set stack !sr stack.(!sr - 1);
- Array.set stack (!sr - 1) (!cr + 1);
- cr := temp
- ;;
- let return () =
- cr := stack.(!sr - 1);
- Array.set stack (!sr - 1) stack.(!sr);
- subtractOne sr
- ;;
- let inputFile = open_in "input.txt" in
- try
- while true; do
- let line = input_line inputFile in
- print_endline line;
- done;
- with End_of_file ->
- close_in inputFile;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement