17abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(*===----------------------------------------------------------------------=== 27abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * Abstract Syntax Tree (aka Parse Tree) 37abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao *===----------------------------------------------------------------------===*) 47abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 57abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(* expr - Base type for all expression nodes. *) 67abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaotype expr = 77abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for numeric literals like "1.0". *) 87abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Number of float 97abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 107abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for referencing a variable, like "a". *) 117abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Variable of string 127abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 137abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for a unary operator. *) 147abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Unary of char * expr 157abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 167abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for a binary operator. *) 177abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Binary of char * expr * expr 187abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 197abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for function calls. *) 207abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Call of string * expr array 217abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 227abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for if/then/else. *) 237abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | If of expr * expr * expr 247abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 257abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao (* variant for for/in. *) 267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | For of string * expr * expr * expr option * expr 277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 287abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(* proto - This type represents the "prototype" for a function, which captures 297abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * its name, and its argument names (thus implicitly the number of arguments the 307abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * function takes). *) 317abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaotype proto = 327abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | Prototype of string * string array 337abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | BinOpPrototype of string * string array * int 347abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 357abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(* func - This type represents a function definition itself. *) 367abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaotype func = Function of proto * expr 37