ast.ml 1.62 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
(*  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' = 
18 19
  (* For debugging the typer: an expression with prescribed type *)
  | DebugTyper of ppat
20 21 22 23 24 25 26 27 28 29 30 31
    
  (* 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 *)
32
  | Op of string * pexpr list
33 34
  | Match of pexpr * branches
  | Map of pexpr * branches
35
  | Dot of (pexpr* Types.label)
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
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