(** Type definitions for abstract syntax tree, assembly code, and exceptions. *) (** [(filename, startline, endline, startcol, endcol)] Location of node in source code. Used for error reporting. *) type location = string * int * int * int * int (** All operators supported by CiviC. *) type operator = | Neg | Not | Add | Sub | Mul | Div | Mod | Eq | Ne | Lt | Le | Gt | Ge | And | Or (** Wrappers for constant values. This eliminates the need for separate [(Bool|Int|Float)Const] nodes, and these values can be passed to {!instr} constructors as well. *) type const = | BoolVal of bool | IntVal of int | FloatVal of float (** Data types supported by CiviC. [ArrayDims] defines an array type with a set of dimensions. {!Dimreduce} replaces this multi-dimensional type with an [Array] type, which signifies a one-dimensional array of a certain basic type. *) type ctype = | Void | Bool | Int | Float | Array of ctype | ArrayDims of ctype * node list (** Annotations for {!node}. Each node has a list of zero or more annotations that are gradually added through the compiler phases: - [Loc] is a location added by the parser. - [Depth] is the nesting level of a variable or function, and is added by {!Context}. - [Type] is a {!ctype} annotation added by {!Typecheck}. - [Index] is the stack index of a variable declaration, added by {!Index}. - [LabelName] is also added during index analysis, it holds the label name of a [FunDef]. *) and annotation = | Loc of location | Depth of int | Type of ctype | Index of int | LabelName of string (** Shorthand for annotation list used in definition of {!node}, should not be used elsewhere. *) and ann = annotation list (** Abstract Syntax Tree nodes. *) 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 (** declaration, dims *) | Return of node * ann (** return value [return ;] *) | Expr of node (** expression statement [;] *) | Block of node list (** body [{ }] *) | If of node * node * ann (** condition, body [if (condition) { body }] *) | IfElse of node * node * node * ann (** condition, true_body, false_body [if () { } else { }] *) | While of node * node * ann (** condition, body [while () { }] *) | DoWhile of node * node * ann (** condition, body [do { } whlie ()] *) (* Expressions *) | Const of const * ann (** constant [bool|int|float constant] *) | ArrayConst of node list * ann (** array initialisation [[ , ... ]] *) | Var of string * node list option * ann (** name, indices [ | [] ] *) | Monop of operator * node * ann (** operator, operand [] *) | Binop of operator * node * node * ann (** operator, left, right [ ] *) | TypeCast of ctype * node * ann (** target_type, value [(target_type)value] *) | 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 (*