= 1024" x-on:close-sidebar="sidebar=window.innerWidth >= 1024 && true">
Legend:
Library
Module
Module type
Parameter
Class
Class type
Library
Module
Module type
Parameter
Class
Class type
Abstract syntax tree built by the Catala parser
Type definitions
type qident = ident Utils.Pos.marked list
type struct_decl_field = {
struct_decl_field_name : ident Utils.Pos.marked;
struct_decl_field_typ : typ Utils.Pos.marked;
}
type struct_decl = {
struct_decl_name : constructor Utils.Pos.marked;
struct_decl_fields : struct_decl_field Utils.Pos.marked list;
}
type enum_decl_case = {
enum_decl_case_name : constructor Utils.Pos.marked;
enum_decl_case_typ : typ Utils.Pos.marked option;
}
type enum_decl = {
enum_decl_name : constructor Utils.Pos.marked;
enum_decl_cases : enum_decl_case Utils.Pos.marked list;
}
type match_case_pattern =
(constructor Utils.Pos.marked option * constructor Utils.Pos.marked) list
* ident Utils.Pos.marked option
type literal_date = {
literal_date_day : int Utils.Pos.marked;
literal_date_month : int Utils.Pos.marked;
literal_date_year : int Utils.Pos.marked;
}
type literal =
| LNumber of literal_number Utils.Pos.marked * literal_unit Utils.Pos.marked option
| LBool of bool
| LMoneyAmount of money_amount
| LDate of literal_date
type aggregate_func =
| AggregateSum of primitive_typ
| AggregateCount
| AggregateExtremum of bool * primitive_typ * expression Utils.Pos.marked
| AggregateArgExtremum of bool * primitive_typ * expression Utils.Pos.marked
and match_case = {
match_case_pattern : match_case_pattern Utils.Pos.marked;
match_case_expr : expression Utils.Pos.marked;
}
and match_cases = match_case Utils.Pos.marked list
and expression =
| MatchWith of expression Utils.Pos.marked * match_cases Utils.Pos.marked
| IfThenElse of expression Utils.Pos.marked * expression Utils.Pos.marked * expression Utils.Pos.marked
| Binop of binop Utils.Pos.marked * expression Utils.Pos.marked * expression Utils.Pos.marked
| Unop of unop Utils.Pos.marked * expression Utils.Pos.marked
| CollectionOp of collection_op Utils.Pos.marked * ident Utils.Pos.marked * expression Utils.Pos.marked * expression Utils.Pos.marked
| MemCollection of expression Utils.Pos.marked * expression Utils.Pos.marked
| TestMatchCase of expression Utils.Pos.marked * match_case_pattern Utils.Pos.marked
| FunCall of expression Utils.Pos.marked * expression Utils.Pos.marked
| Builtin of builtin_expression
| Literal of literal
| EnumInject of constructor Utils.Pos.marked option * constructor Utils.Pos.marked * expression Utils.Pos.marked option
| StructLit of constructor Utils.Pos.marked * (ident Utils.Pos.marked * expression Utils.Pos.marked) list
| ArrayLit of expression Utils.Pos.marked list
| Ident of ident
| Dotted of expression Utils.Pos.marked * constructor Utils.Pos.marked option * ident Utils.Pos.marked
(*Dotted is for both struct field projection and sub-scope variables
*)
type exception_to =
| NotAnException
| UnlabeledException
| ExceptionToLabel of ident Utils.Pos.marked
type rule = {
rule_label : ident Utils.Pos.marked option;
rule_exception_to : exception_to;
rule_parameter : ident Utils.Pos.marked option;
rule_condition : expression Utils.Pos.marked option;
rule_name : qident Utils.Pos.marked;
rule_consequence : bool Utils.Pos.marked;
}
type definition = {
definition_label : ident Utils.Pos.marked option;
definition_exception_to : exception_to;
definition_name : qident Utils.Pos.marked;
definition_parameter : ident Utils.Pos.marked option;
definition_condition : expression Utils.Pos.marked option;
definition_expr : expression Utils.Pos.marked;
}
type meta_assertion =
| FixedBy of qident Utils.Pos.marked * ident Utils.Pos.marked
| VariesWith of qident Utils.Pos.marked * expression Utils.Pos.marked * variation_typ Utils.Pos.marked option
type assertion = {
assertion_condition : expression Utils.Pos.marked option;
assertion_content : expression Utils.Pos.marked;
}
type scope_use_item =
| Rule of rule
| Definition of definition
| Assertion of assertion
| MetaAssertion of meta_assertion
type scope_use = {
scope_use_condition : expression Utils.Pos.marked option;
scope_use_name : constructor Utils.Pos.marked;
scope_use_items : scope_use_item Utils.Pos.marked list;
}
type scope_decl_context_scope = {
scope_decl_context_scope_name : ident Utils.Pos.marked;
scope_decl_context_scope_sub_scope : constructor Utils.Pos.marked;
}
type scope_decl_context_data = {
scope_decl_context_item_name : ident Utils.Pos.marked;
scope_decl_context_item_typ : typ Utils.Pos.marked;
}
type scope_decl_context_item =
| ContextData of scope_decl_context_data
| ContextScope of scope_decl_context_scope
type scope_decl = {
scope_decl_name : constructor Utils.Pos.marked;
scope_decl_context : scope_decl_context_item Utils.Pos.marked list;
}
type code_item =
| ScopeUse of scope_use
| ScopeDecl of scope_decl
| StructDecl of struct_decl
| EnumDecl of enum_decl
type code_block = code_item Utils.Pos.marked list
type source_repr = string Utils.Pos.marked
type law_article = {
law_article_name : string Utils.Pos.marked;
law_article_id : string option;
law_article_expiration_date : string option;
law_article_precedence : int;
}
type law_include =
| PdfFile of string Utils.Pos.marked * int option
| CatalaFile of string Utils.Pos.marked
| LegislativeText of string Utils.Pos.marked
type law_structure =
| LawInclude of law_include
| LawHeading of law_heading * law_structure list
| LawArticle of law_article * law_article_item list
| MetadataBlock of code_block * source_repr
| IntermediateText of string
type source_file_or_master =
| SourceFile of program_item list
| MasterFile of string Utils.Pos.marked list
Visitor classes for programs
To allow for quick traversal and/or modification of this AST structure, we provide a visitor design pattern. This feature is implemented via François Pottier's OCaml visitors library.
Program map visitor
class virtual 'self program_map : object ... end
Program iter visitor
class virtual 'self program_iter : object ... end