X-Git-Url: https://git.hcoop.net/hcoop/domtool2.git/blobdiff_plain/27d9de59634e853cac7adf09c9a7f82b3da5fcdc..77a8fca278b561808959fa1aa7d9f02c5cfe7720:/src/ast.sml diff --git a/src/ast.sml b/src/ast.sml index e62c8fb..ba00f78 100644 --- a/src/ast.sml +++ b/src/ast.sml @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*) + *) (* Configuration language abstract syntax *) @@ -48,6 +48,10 @@ datatype typ' = * - Is valid in the given pred * - Expects an environment compatible with the first record * - Modifies it according to the second record *) + | TNested of pred * typ + (* Allow nested configuration, in the form of a function from an action + * satisfying the first predicate to an action satisfying the second and + * with the same environment variable IO behavior. *) | TError (* Marker that something already went wrong, so don't generate further @@ -55,7 +59,7 @@ datatype typ' = | TUnif of string * typ option ref (* Unification variable to be determined during type-checking *) withtype typ = typ' * position - and record = typ StringMap.map + and record = (typ' * position) StringMap.map datatype exp' = EInt of int @@ -72,16 +76,33 @@ datatype exp' = | EApp of exp * exp (* Function application *) + | ESkip + (* Do-nothing action *) | ESet of string * exp (* Set an environment variable *) | EGet of string * string * exp (* Get an environment variable *) | ESeq of exp list (* Monad sequencer; execute a number of commands in order *) - | ELocal of exp - (* Local execution; execute the action and then restore the previous - * environment. *) + | ELocal of exp * exp + (* Local execution; like ESeq, but the writes of the first + * action are abandoned *) + | EWith of exp * exp + (* Apply a TNested to an action *) + | EALam of string * pred * exp + (* Abstraction for building TNested values *) withtype exp = exp' * position +datatype decl' = + DExternType of string + | DExternVal of string * typ + | DVal of string * typ option * exp + | DContext of string +type decl = decl' * string option * position + +type file = string option * decl list * exp option + +fun multiApp (f, loc, args) = + foldl (fn (arg, e) => (EApp (e, arg), loc)) f args end