26 lines
678 B
OCaml
26 lines
678 B
OCaml
|
|
open Parser.Ast;;
|
|
|
|
(* This type represents an intermediate step between the AST and opcodes in our
|
|
compiler. We need this extra step to resolve addresses, e.g. how do you know
|
|
what exact address an if expression needs to jump to before you compile it?
|
|
you don't, you just keep a symbolic label there, resolve later.
|
|
*)
|
|
type intermediate_opcode =
|
|
| ISelect of string * string
|
|
| ILDF of string
|
|
| ILD of int (* an index into the constant table *)
|
|
| INil
|
|
| IRet
|
|
| IAdd
|
|
| IJoin
|
|
| ILabel of string (* does not emit any byte code *)
|
|
|
|
|
|
|
|
|
|
(* TODO: Complete *)
|
|
let (compile : lisp_ast -> intermediate_opcode list) = function
|
|
| LInt x -> [ILD x]
|
|
| _ -> [];;
|