package catala

  1. Overview
  2. Docs

Builds a context that allows for mapping each name to a precise uid, taking lexical scopes into account

Name resolution context

type ident = string
type unique_rulename =
  1. | Ambiguous
  2. | Unique of Desugared.Ast.RuleName.t
type scope_context = {
  1. var_idmap : Scopelang.Ast.ScopeVar.t Desugared.Ast.IdentMap.t;
    (*

    Scope variables

    *)
  2. label_idmap : Desugared.Ast.RuleName.t Desugared.Ast.IdentMap.t;
  3. default_rulemap : unique_rulename Desugared.Ast.ScopeDefMap.t;
    (*

    What is the default rule to refer to for unnamed exceptions, if any

    *)
  4. sub_scopes_idmap : Scopelang.Ast.SubScopeName.t Desugared.Ast.IdentMap.t;
    (*

    Sub-scopes variables

    *)
  5. sub_scopes : Scopelang.Ast.ScopeName.t Scopelang.Ast.SubScopeMap.t;
    (*

    To what scope sub-scopes refer to?

    *)
}

Inside a scope, we distinguish between the variables and the subscopes.

Types of the fields of a struct

Types of the payloads of the cases of an enum

type context = {
  1. local_var_idmap : Scopelang.Ast.Var.t Desugared.Ast.IdentMap.t;
    (*

    Inside a definition, local variables can be introduced by functions arguments or pattern matching

    *)
  2. scope_idmap : Scopelang.Ast.ScopeName.t Desugared.Ast.IdentMap.t;
    (*

    The names of the scopes

    *)
  3. struct_idmap : Scopelang.Ast.StructName.t Desugared.Ast.IdentMap.t;
    (*

    The names of the structs

    *)
  4. field_idmap : Scopelang.Ast.StructFieldName.t Scopelang.Ast.StructMap.t Desugared.Ast.IdentMap.t;
    (*

    The names of the struct fields. Names of fields can be shared between different structs

    *)
  5. enum_idmap : Scopelang.Ast.EnumName.t Desugared.Ast.IdentMap.t;
    (*

    The names of the enums

    *)
  6. constructor_idmap : Scopelang.Ast.EnumConstructor.t Scopelang.Ast.EnumMap.t Desugared.Ast.IdentMap.t;
    (*

    The names of the enum constructors. Constructor names can be shared between different enums

    *)
  7. scopes : scope_context Scopelang.Ast.ScopeMap.t;
    (*

    For each scope, its context

    *)
  8. structs : struct_context Scopelang.Ast.StructMap.t;
    (*

    For each struct, its context

    *)
  9. enums : enum_context Scopelang.Ast.EnumMap.t;
    (*

    For each enum, its context

    *)
  10. var_typs : (typ Utils.Pos.marked * bool) Scopelang.Ast.ScopeVarMap.t;
    (*

    The types of each scope variable declared

    *)
}

Main context used throughout Surface.Desugaring

Helpers

val raise_unsupported_feature : string -> Utils.Pos.t -> 'a

Temporary function raising an error message saying that a feature is not supported yet

val raise_unknown_identifier : string -> ident Utils.Pos.marked -> 'a

Function to call whenever an identifier used somewhere has not been declared in the program previously

Gets the type associated to an uid

val is_var_cond : context -> Scopelang.Ast.ScopeVar.t -> bool

Get the variable uid inside the scope given in argument

Get the subscope uid inside the scope given in argument

val is_subscope_uid : Scopelang.Ast.ScopeName.t -> context -> ident -> bool

is_subscope_uid scope_uid ctxt y returns true if y belongs to the subscopes of scope_uid.

Checks if the var_uid belongs to the scope scope_uid

Retrieves the type of a scope definition from the context

val is_def_cond : context -> Desugared.Ast.ScopeDef.t -> bool
val is_type_cond : Ast.typ Utils.Pos.marked -> bool
val add_def_local_var : context -> ident Utils.Pos.marked -> context * Scopelang.Ast.Var.t

Adds a binding to the context

API

val form_context : Ast.program -> context

Derive the context from metadata, in one pass over the declarations