OSDN Git Service

df2db1f3aeb1096e9b6f66c2667ed38342ecd7ce
[happyabc/happyabc.git] / src / ast.mli
1 (** Abstract syntax tree *)
2
3 (** name := namespace * symbol *)
4 type name = string * string
5
6 (** A type of expression. Expression does not have side-effect. *)
7 type expr = 
8     Int     of int
9   | String  of string
10   | Bool    of bool
11   | Float   of float
12   | Var     of string
13   | Lambda  of string list * expr
14   | Call    of expr list
15   | If      of expr * expr * expr
16   | Let     of (string*expr) list * expr
17   | LetRec  of (string*expr) list * expr
18   | Block   of expr list
19   | New     of name * expr list
20   | Invoke  of expr * string * expr list (** (. obj (f <arg1> <arg2> ..)) *)
21   | SlotRef of expr * string             (** (slot-ref  <obj> <name>) *)
22   | SlotSet of expr * string * expr      (** (slot-set! <obj> <name> <value>) *)
23
24 (** A type of statement. Statement has side-effect *)
25 type stmt = 
26   | Define of string * expr
27   | Expr of expr
28   | Class of string * name * attr list * method_ list
29 and attr    = string
30 and method_ = string * string list * expr
31
32 (** A tyye of program. *)
33 type program = stmt list
34
35 (** [map f e] applys f to all-sub expression of [e]. *)
36 val map : (expr -> expr) -> expr -> expr
37
38 val to_string : expr -> string
39 val to_string_stmt : stmt -> string
40
41 (**{6 Lift}*)
42
43 val lift_stmt : (expr->expr) -> stmt -> stmt
44 val lift_program : (expr->expr) -> program -> program