summaryrefslogtreecommitdiffstats
path: root/syntax.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-27 08:28:40 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-27 08:28:40 -0700
commit9f5889c1263d63b953b3a324da07321deef5ca58 (patch)
treeeb4a9be038660ced671da9fbb4617812f7cd2125 /syntax.sml
parentAdd tests for let. (diff)
downloadsml-9f5889c1263d63b953b3a324da07321deef5ca58.tar.zst
Add integer arithmetic.
Diffstat (limited to 'syntax.sml')
-rw-r--r--syntax.sml23
1 files changed, 20 insertions, 3 deletions
diff --git a/syntax.sml b/syntax.sml
index 3e70ba1..b91e0a2 100644
--- a/syntax.sml
+++ b/syntax.sml
@@ -31,7 +31,12 @@ struct
(* Lambda language *)
type var = int
- datatype primop = PExit
+ datatype primop =
+ PExit
+ | PAdd
+ | PSub
+ | PMul
+ | PDiv
datatype lexp =
LVar of var
@@ -64,6 +69,10 @@ struct
| OPeek of var * int * value
| OShuf of var * value
| OExit of value
+ | OAdd of var * value * value
+ | OSub of var * value * value
+ | OMul of var * value * value
+ | ODiv of var * value * value
| OLabel of var
fun listToString (show : 'a -> string) (l : 'a list) =
@@ -121,6 +130,10 @@ struct
fun primopToString (x : primop) : string =
case x of
PExit => "PExit"
+ | PAdd => "PAdd"
+ | PSub => "PSub"
+ | PMul => "PMul"
+ | PDiv => "PDiv"
fun lexpToString (x : lexp) : string =
case x of
@@ -156,11 +169,15 @@ struct
fun opcodeToString (oper : opcode) : string =
case oper of
- OAlloc (r, s) => "Var " ^ Int.toString r ^ " = OAlloc(" ^ valueToString s ^ ")"
+ OAlloc (r, s) => "Var " ^ Int.toString r ^ " = OAlloc (" ^ valueToString s ^ ")"
| OCall => "OCall"
| OPoke (i, p, v) => "Var " ^ Int.toString p ^ "[" ^ Int.toString i ^ "] = " ^ valueToString v
| OPeek (r, i, p) => "Var " ^ Int.toString r ^ " = " ^ valueToString p ^ "[" ^ Int.toString i ^ "]"
| OShuf (d, s) => "Var " ^ Int.toString d ^ " = " ^ valueToString s
- | OExit v => "OExit " ^ valueToString v
+ | OExit v => "OExit (" ^ valueToString v ^ ")"
+ | OAdd (r, v1, v2) => "Var " ^ Int.toString r ^ " = OAdd (" ^ valueToString v1 ^ ", " ^ valueToString v2 ^ ")"
+ | OSub (r, v1, v2) => "Var " ^ Int.toString r ^ " = OSub (" ^ valueToString v1 ^ ", " ^ valueToString v2 ^ ")"
+ | OMul (r, v1, v2) => "Var " ^ Int.toString r ^ " = OMul (" ^ valueToString v1 ^ ", " ^ valueToString v2 ^ ")"
+ | ODiv (r, v1, v2) => "Var " ^ Int.toString r ^ " = ODiv (" ^ valueToString v1 ^ ", " ^ valueToString v2 ^ ")"
| OLabel l => "OLabel " ^ Int.toString l
end