(** Type definitions for abstract syntax tree, assembly code, and exceptions. *) (** {2 Abstract Syntax Tree} *) (** [(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 int32 | 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 the [Array] type, which signifies a one-dimensional array of a certain basic type. [Unknown] is used by {!Typecheck} when the result of an operation is unclear due to a type error. *) type ctype = | Void | Bool | Int | Float | Array of ctype | ArrayDims of ctype * node list | Unknown (** 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. All attributes except for [ann] (annotations) are documented. [Program] to [Arg] are types returned by the parser, the rest of the types are annotations or transformations for convenience during later traversals. *) and node = (* Global *) | Program of node list * ann (** list of declarations *) | GlobalDec of ctype * string * ann (** type, name [extern ;] *) | GlobalDef of bool * ctype * string * node option * ann (** export, type, name, initialisation [ [= ];] *) | FunDec of ctype * string * node list * ann (** ret_type, name, params [extern ();] *) | FunDef of bool * ctype * string * node list * node * ann (** export, ret_type, name, params, body [[export ] () ] *) | Param of ctype * string * ann (** type, name [ ] *) | Dim of string * ann (** name [] Used in [ArrayDims] for [Param] of array type. *) | VarDecs of node list (** Holds all [VarDec] nodes in a [FunDef]. *) | LocalFuns of node list (** Holds all local [FunDef] nodes in a [FunDef]. *) (* 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 [for (int = , [, ]) ] *) | Return of node * ann (** Return value [return ;] *) | Expr of node (** Expression statement [;] *) | Block of node list (** Statement list enclosed in braces: body [{ }] *) | If of node * node * ann (** condition, body [if () ] *) | 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 while ()] *) (* Expressions *) | Const of const * ann (** Constant value, e.g. [0] or [1.0] or [true]. *) | 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 wrapper. *) (* Additional types for convenience in traversals * Mostly used to annotate existing nodes with information from declarations *) | Allocate of node * node list * ann (** Array allocation: declaration, dimensions [ = __allocate();] *) | VarUse of node * node list option * ann (** Replacement for [Var] with declaration. *) | FunUse of node * node list * ann (** Replacement for [FunCall] with declaration. *) | VarLet of node * node list option * node * ann (** Replacement for [Assign] with declaration. *) | Cond of node * node * node * ann (** cond, true_expr, false_expr [ ? : ] Used for short-circuit evaluation. *) | DummyNode (** Null node, pruned by {!Util.flatten_blocks}, which is called by {!Util.traverse_unit} in a traversal. *) (** {2 Assembly instructions} *) (** Stack scopes. Correspond to [(load|store|isr)[lnge ]] respectively. *) type stack_scope = Local | Rel of int | Glob | Extern | Current (** Function scopes. *) type rtn_scope = ExternFun of int | LocalFun of int * string (** Assembly instructions. *) type instr = | Comment of string (** [; ] *) | InlineComment of instr * string (** [ ; ] *) | Label of string (** [