Module Typing.Typed_ast
type identifier
=
|
Variable of Ast.Ast_types.type_expr * Ast.Ast_types.Var_name.t
|
ObjField of Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * Ast.Ast_types.Var_name.t * Ast.Ast_types.type_expr * Ast.Ast_types.Field_name.t
class of the object and whether parameterised, type of field
val string_of_id : identifier -> string
type expr
=
|
Integer of Ast.Ast_types.loc * int
no need for type_expr annotation as obviously TEInt
|
Boolean of Ast.Ast_types.loc * bool
no need for type_expr annotation as obviously TEBool
|
Identifier of Ast.Ast_types.loc * identifier
Type information associated with identifier
|
BlockExpr of Ast.Ast_types.loc * block_expr
used to interconvert with block expr
|
Constructor of Ast.Ast_types.loc * Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * constructor_arg list
The type of the object created can be inferred from class name and any type param
|
Let of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.Var_name.t * expr
|
Assign of Ast.Ast_types.loc * Ast.Ast_types.type_expr * identifier * expr
|
Consume of Ast.Ast_types.loc * identifier
Type is associated with the identifier
|
MethodApp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.type_expr list * Ast.Ast_types.Var_name.t * Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * Ast.Ast_types.Method_name.t * expr list
|
FunctionApp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.type_expr list * Ast.Ast_types.Function_name.t * expr list
|
Printf of Ast.Ast_types.loc * string * expr list
no need for type_expr annotation as obviously TEVoid
|
FinishAsync of Ast.Ast_types.loc * Ast.Ast_types.type_expr * async_expr list * block_expr
overall type is that of the expr on the current thread - since forked exprs' values are ignored
|
If of Ast.Ast_types.loc * Ast.Ast_types.type_expr * expr * block_expr * block_expr
If ___ then ___ else ___ - type is that of the branch exprs
|
While of Ast.Ast_types.loc * expr * block_expr
While ___ do ___ ; - no need for type_expr annotation as type of a loop is TEVoid
|
BinOp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.bin_op * expr * expr
|
UnOp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.un_op * expr
Similar to Parsed AST, only we add an extra type_expr annotation to denote the overall type of the expression. For loop is desugared to while loop
and block_expr
=
|
Block of Ast.Ast_types.loc * Ast.Ast_types.type_expr * expr list
type is of the final expr in block
and async_expr
=
|
AsyncExpr of block_expr
and constructor_arg
=
|
ConstructorArg of Ast.Ast_types.type_expr * Ast.Ast_types.Field_name.t * expr
Constructor arg consists of a field and the expression being assigned to it (annotated with the type of the expression)
type function_defn
=
|
TFunction of Ast.Ast_types.Function_name.t * Ast.Ast_types.borrowed_ref option * Ast.Ast_types.type_expr * Ast.Ast_types.param list * block_expr
Function defn consists of the function name, return type (and whether it returns a borrowed ref), the list of params, and the body expr of the function
type method_defn
=
|
TMethod of Ast.Ast_types.Method_name.t * Ast.Ast_types.borrowed_ref option * Ast.Ast_types.type_expr * Ast.Ast_types.param list * Ast.Ast_types.capability list * block_expr
Method defn consists the method name, return type (and whether it returns a borrowed ref), the list of params, the capabilities used and the body expr of the function
type class_defn
=
|
TClass of Ast.Ast_types.Class_name.t * Ast.Ast_types.generic_type option * Ast.Ast_types.Class_name.t option * Ast.Ast_types.capability list * Ast.Ast_types.field_defn list * method_defn list
Class definitions consist of the class name and optionally specifying if generic and if it inherits from another class, its capabilities and the fields and methods in the class
type program
=
|
Prog of class_defn list * function_defn list * block_expr
Each bolt program defines the classes,followed by functions, followed by the main expression to execute.