(* Abstract syntax as produced by the parsed *) open Location type pprog = pmodule_item list and pmodule_item = pmodule_item' located and pmodule_item' = | TypeDecl of string * ppat | PatDecl of string * ppat | FunDecl of abstr | LetDecl of ppat * pexpr | EvalStatement of pexpr | Debug of string * ([`Pat of ppat | `Expr of pexpr] list) and pexpr = pexpr' located and pexpr' = (* For debugging the typer: an expression with prescribed type *) | DebugTyper of ppat (* CDuce is a Lambda-calculus ... *) | Var of string | Apply of pexpr * pexpr | Abstraction of abstr (* Data constructors *) | Cst of Types.const | Pair of pexpr * pexpr | RecordLitt of (Types.label * pexpr) list (* Data destructors *) | Op of string * pexpr list | Match of pexpr * branches | Map of pexpr * branches and abstr = { fun_name : string option; fun_iface : (ppat * ppat) list; fun_body : branches } and branches = (ppat * pexpr) list (* A common syntactic class for patterns and types *) and ppat = ppat' located and ppat' = | PatVar of string | Recurs of ppat * (string * ppat) list | Internal of Types.descr | Or of ppat * ppat | And of ppat * ppat | Diff of ppat * ppat | Prod of ppat * ppat | Arrow of ppat * ppat | Record of Types.label * bool * ppat | Capture of Patterns.capture | Constant of Patterns.capture * Types.const | Regexp of regexp * ppat and regexp = | Epsilon | Elem of ppat | Seq of regexp * regexp | Alt of regexp * regexp | Star of regexp | WeakStar of regexp | SeqCapture of Patterns.capture * regexp