X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fast.mli;h=225e42975f75bf66431ad746e19026f865778206;hb=5e13f1e2a3dc1237fcf2fa141d8379bdd36bde61;hp=6179fb4d7077ba66d7f156d3b0d00e7b14eed559;hpb=5a6a8b2b8e515941f9a2b3cc051da646ae696251;p=goals.git diff --git a/src/ast.mli b/src/ast.mli index 6179fb4..225e429 100644 --- a/src/ast.mli +++ b/src/ast.mli @@ -17,36 +17,84 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *) -type file = stmt list -and stmt = - (* let id = expr *) - | Let of id * expr - (* goal id (params) = patterns : exprs = code *) - | Goal of id * id list * pattern list * expr list * code option +module Env : sig + type key = string + type 'a t + val empty: 'a t + val add: key -> 'a -> 'a t -> 'a t + val find: key -> 'a t -> 'a + val fold: (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b + val filter: (key -> 'a -> bool) -> 'a t -> 'a t + val bindings: 'a t -> (key * 'a) list + + (* This is not the normal Map.merge function. *) + val merge : 'a t -> 'a t -> 'a t +end + +(** Location where we parsed from $loc = $startpos, $endpos *) +type loc = Lexing.position * Lexing.position +val noloc : loc +val print_loc : out_channel -> loc -> unit +val string_loc : unit -> loc -> string + +(** An environment is a set of variable and goal definitions, mapping + variable or goal name -> expression. *) +type env = expr Env.t and pattern = - (* match tactic such as file ("filename") *) - | PTactic of id * substs list - (* match named variable, which must be a string or list *) - | PVarSubst of id + | PPred of loc * id * substs list + (** match predicate such as is-file ("filename") *) and expr = - (* goalname (params), tactic (params) etc. *) - | ECall of id * expr list - (* variable *) - | EVar of id - (* string with %-substitutions *) - | EString of substs - (* list *) - | EList of expr list + | EGoalDefn of loc * goal + (** goal (params) = patterns : exprs code *) + | EFuncDefn of loc * func + (** function (params) = code *) + | EPredDefn of loc * pred + (** predicate (params) = code *) + | ECall of loc * id * expr list + (** call goal (params) or function (params) *) + | EPredCtor of loc * id * expr list + (** constructor is-predicate (params) *) + | EVar of loc * id + (** variable, or goal call with no parameters *) + | EList of loc * expr list + (** list *) + | ESubsts of loc * substs + (** string with %-substitutions *) + | EConstant of loc * constant + (** constant expression, such as a plain string, int, boolean, etc. *) +and constant = + | CString of string +and goal = param_decl list * pattern list * expr list * code option +and func = param_decl list * returning * bool * code +and pred = param_decl list * code +and param_decl = id (** goal/func/pred parameter. *) and id = string -and code = substs +and code = substs * bool (** code + quiet flag *) +and returning = RetExpr | RetStrings | RetString and substs = subst list and subst = - (* String literal part. *) | SString of string - (* %-substitution. *) + (** String literal part. *) | SVar of id + (** %-substitution. *) + +val getvar : env -> loc -> id -> expr +(** Look up a variable in the environment. Raise [Failure _] + if not found. *) + +val getgoal : env -> loc -> id -> goal +(** Look up a goal in the environment. Raise [Failure _] if not + found or if the named variable is not a goal. *) + +val getfunc : env -> loc -> id -> func +(** Look up a function in the environment. Raise [Failure _] if not + found or if the named variable is not a function. *) + +val getpred : env -> loc -> id -> pred +(** Look up a predicate in the environment. Raise [Failure _] if not + found or if the named variable is not a predicate. *) -(* This is used for incrementally building Ast.substs in the parser. *) +(** This is used for incrementally building Ast.substs in the parser. *) module Substs : sig type t val create : unit -> t @@ -56,4 +104,8 @@ module Substs : sig val add_var : t -> string -> unit end -val print_file : out_channel -> file -> unit +(** %a formatters. *) +val print_env : out_channel -> env -> unit +val string_pattern : unit -> pattern -> string +val string_expr : unit -> expr -> string +val print_expr : out_channel -> expr -> unit