type location = string * int * int * int * int let noloc = ("", 0, 0, 0, 0) type operator = | Neg | Not | Add | Sub | Mul | Div | Mod | Eq | Ne | Lt | Le | Gt | Ge | And | Or type const = | BoolVal of bool | IntVal of int | FloatVal of float type ctype = | Void | Bool | Int | Float | Array of ctype | ArrayDims of ctype * node list and annotation = | Loc of location | Depth of int | Index of int | Type of ctype | LabelName of string and ann = annotation list and node = (* Global *) | Program of node list * ann (* list of declarations *) | FunDec of ctype * string * node list * ann (* ret_type, name, params *) | FunDef of bool * ctype * string * node list * node * ann (* export, ret_type, name, params, body *) | GlobalDec of ctype * string * ann (* type, name *) | GlobalDef of bool * ctype * string * node option * ann (* export, type, name, initialisation? *) | Param of ctype * string * ann (* type, name *) | Dim of string * ann (* name *) | VarDecs of node list | LocalFuns of node list (* Statements *) | VarDec of ctype * string * node option * ann (* type, name, initialisation? *) | Assign of string * node list option * node * ann (* name, indices?, value *) | For of string * node * node * node * node * ann (* counter, start, stop, step, body *) | Allocate of node * node list * ann (* dec, dims # name = __allocate(dims) *) | Return of node * ann (* return ; *) | Expr of node (* ; *) | Block of node list (* { } *) | If of node * node * ann (* cond, body *) | IfElse of node * node * node * ann (* cond, true_body, false_body *) | While of node * node * ann (* cond, body *) | DoWhile of node * node * ann (* cond, body *) (* Expressions *) | Const of const * ann (* bool|int|float value *) | ArrayConst of node list * ann (* [] *) | Var of string * node list option * ann (* []? *) | Monop of operator * node * ann (* op, operand *) | Binop of operator * node * node * ann (* op, left, right *) | TypeCast of ctype * node * ann (* (type) operand *) | FunCall of string * node list * ann (* name(args) *) | Arg of node (* function argument *) (* Additional types for convenience in traversals * Mostly used to annotate existing nodes with information from declarations *) | VarUse of node * node list option * ann (* Same as Var, but with decl. *) | FunUse of node * node list * ann (* Same as FunCall, but with decl. *) | VarLet of node * node list option * node * ann (* replacement for Assign *) | ArrayScalar of node (* (Bool|Int|Float)Const *) | ArrayInit of node * node list (* Array(Scalar|Const), dimensions *) | Cond of node * node * node * ann (* cond, true_expr, false_expr *) | DummyNode (* null node, pruned by traversals *) type stack_scope = Glob | Local | Rel of int | Current type rtn_scope = ExternFun of int | LocalFun of int * string type instr = | Comment of string (* # *) | InlineComment of instr * string (* # *) | Label of string (*