X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fast.mli;h=e47ddc35fd1b65c5770e74fef64eb38b5c83a6bb;hb=3ed50d510dbab127125a8af9f72554c2dec72ef5;hp=e2189cf30cb0c20f461412744d73ab6df32c08da;hpb=4d0527cd7ced1d96720e3af56da29a19551944f7;p=goals.git diff --git a/src/ast.mli b/src/ast.mli index e2189cf..e47ddc3 100644 --- a/src/ast.mli +++ b/src/ast.mli @@ -17,26 +17,55 @@ * 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 + (** match tactic such as *file ("filename") *) + | PTactic of loc * id * substs list and expr = - (** goalname (params), tactic (params) etc. *) - | ECall of id * expr list - (** variable *) - | EVar of id - (** string with %-substitutions *) - | EString of substs + (** goal (params) = patterns : exprs code *) + | EGoalDefn of loc * goal + (** tactic (params) = code *) + | ETacticDefn of loc * tactic + (** call goalname (params) etc. *) + | ECallGoal of loc * id * expr list + (** call *tactic (params) etc. *) + | ETacticCtor of loc * id * expr list + (** variable, or goal call with no parameters *) + | EVar of loc * id (** list *) - | EList of expr list + | EList of loc * expr list + (** string with %-substitutions *) + | ESubsts of loc * substs + (** constant expression, such as a plain string, int, boolean, etc. *) + | EConstant of loc * constant +and constant = + | CString of string +and goal = param_decl list * pattern list * expr list * code option +and tactic = param_decl list * code + (** Goal/tactic parameter. *) +and param_decl = id and id = string and code = substs and substs = subst list @@ -46,6 +75,34 @@ and subst = (** %-substitution. *) | SVar of id +(** Look up a variable in the environment. Raise [Failure _] + if not found. *) +val getvar : env -> loc -> id -> expr + +(** Look up a goal in the environment. Raise [Failure _] if not + found or if the named variable is not a goal. *) +val getgoal : env -> loc -> id -> goal + +(** Look up a tactic in the environment. Raise [Failure _] if not + found or if the named variable is not a tactic. *) +val gettactic : env -> loc -> id -> tactic + +(** Take any expression and simplify it down to a constant. + If the expression cannot be simplified then this raises + [Failure _]. *) +val to_constant : env -> expr -> constant + +(** Take a substitution list and try to turn it into a simple + string by evaluating every variable. If not possible this + raises [Failure _]. *) +val substitute : env -> loc -> substs -> string + +(** Similar to {!substitute} except this is used where we will + pass the result immediately to the shell to execute. Variables + are substituted with shell quoted strings. Raises [Failure _] + on error. *) +val to_shell_script : env -> loc -> substs -> string + (** This is used for incrementally building Ast.substs in the parser. *) module Substs : sig type t @@ -56,4 +113,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