65 lines
1 KiB
OCaml
65 lines
1 KiB
OCaml
type type_t =
|
|
| Int_t
|
|
| Bool_t
|
|
| Func_t of type_t * type_t list
|
|
|
|
module Syntax = struct
|
|
type ident = string
|
|
|
|
type value =
|
|
| Int of int
|
|
| Bool of bool
|
|
|
|
type expr =
|
|
| Val of
|
|
{ value : value
|
|
; pos : Lexing.position
|
|
}
|
|
| Var of
|
|
{ name : ident
|
|
; pos : Lexing.position
|
|
}
|
|
| Call of
|
|
{ func : ident
|
|
; args : expr list
|
|
; pos : Lexing.position
|
|
}
|
|
|
|
type instr =
|
|
| Decl of
|
|
{ name : ident
|
|
; type_t : type_t
|
|
; pos : Lexing.position
|
|
}
|
|
| Assign of
|
|
{ var : ident
|
|
; expr : expr
|
|
; pos : Lexing.position
|
|
}
|
|
| Return of
|
|
{ expr : expr
|
|
; pos : Lexing.position
|
|
}
|
|
|
|
and block = instr list
|
|
end
|
|
|
|
module IR = struct
|
|
type ident = string
|
|
|
|
type value =
|
|
| Int of int
|
|
| Bool of bool
|
|
|
|
type expr =
|
|
| Val of value
|
|
| Var of ident
|
|
| Call of ident * expr list
|
|
|
|
type instr =
|
|
| Decl of ident
|
|
| Assign of ident * expr
|
|
| Return of expr
|
|
|
|
and block = instr list
|
|
end
|