2001-09-07 00:55:07 -07:00
|
|
|
(* camlp4r pa_extend.cmo q_MLast.cmo *)
|
|
|
|
(***********************************************************************)
|
|
|
|
(* *)
|
|
|
|
(* Camlp4 *)
|
|
|
|
(* *)
|
|
|
|
(* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt *)
|
|
|
|
(* *)
|
|
|
|
(* Copyright 1998 Institut National de Recherche en Informatique et *)
|
|
|
|
(* Automatique. Distributed only by permission. *)
|
|
|
|
(* *)
|
|
|
|
(***********************************************************************)
|
|
|
|
|
2001-12-14 11:39:34 -08:00
|
|
|
(* This file has been generated by program: do not edit! *)
|
2001-09-07 00:55:07 -07:00
|
|
|
|
|
|
|
open Pcaml;;
|
|
|
|
|
|
|
|
type spat_comp =
|
|
|
|
SpTrm of MLast.loc * MLast.patt * MLast.expr option
|
|
|
|
| SpNtr of MLast.loc * MLast.patt * MLast.expr
|
|
|
|
| SpStr of MLast.loc * MLast.patt
|
|
|
|
;;
|
|
|
|
type sexp_comp =
|
|
|
|
SeTrm of MLast.loc * MLast.expr | SeNtr of MLast.loc * MLast.expr
|
|
|
|
;;
|
|
|
|
|
|
|
|
let strm_n = "strm__";;
|
|
|
|
let peek_fun loc =
|
|
|
|
MLast.ExAcc (loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "peek"))
|
|
|
|
;;
|
|
|
|
let junk_fun loc =
|
|
|
|
MLast.ExAcc (loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "junk"))
|
|
|
|
;;
|
|
|
|
|
|
|
|
(* Parsers. *)
|
|
|
|
(* In syntax generated, many cases are optimisations. *)
|
|
|
|
|
|
|
|
let rec pattern_eq_expression p e =
|
|
|
|
match p, e with
|
|
|
|
MLast.PaLid (_, a), MLast.ExLid (_, b) -> a = b
|
|
|
|
| MLast.PaUid (_, a), MLast.ExUid (_, b) -> a = b
|
|
|
|
| MLast.PaApp (_, p1, p2), MLast.ExApp (_, e1, e2) ->
|
|
|
|
pattern_eq_expression p1 e1 && pattern_eq_expression p2 e2
|
|
|
|
| _ -> false
|
|
|
|
;;
|
|
|
|
|
|
|
|
let is_raise e =
|
|
|
|
match e with
|
|
|
|
MLast.ExApp (_, MLast.ExLid (_, "raise"), _) -> true
|
|
|
|
| _ -> false
|
|
|
|
;;
|
|
|
|
|
|
|
|
let is_raise_failure e =
|
|
|
|
match e with
|
|
|
|
MLast.ExApp
|
|
|
|
(_, MLast.ExLid (_, "raise"),
|
|
|
|
MLast.ExAcc
|
|
|
|
(_, MLast.ExUid (_, "Stream"), MLast.ExUid (_, "Failure"))) ->
|
|
|
|
true
|
|
|
|
| _ -> false
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec handle_failure e =
|
|
|
|
match e with
|
|
|
|
MLast.ExTry
|
|
|
|
(_, te,
|
|
|
|
[MLast.PaAcc
|
|
|
|
(_, MLast.PaUid (_, "Stream"), MLast.PaUid (_, "Failure")), None,
|
|
|
|
e]) ->
|
|
|
|
handle_failure e
|
|
|
|
| MLast.ExMat (_, me, pel) ->
|
|
|
|
handle_failure me &&
|
|
|
|
List.for_all
|
|
|
|
(function
|
|
|
|
_, None, e -> handle_failure e
|
|
|
|
| _ -> false)
|
|
|
|
pel
|
|
|
|
| MLast.ExLet (_, false, pel, e) ->
|
|
|
|
List.for_all (fun (p, e) -> handle_failure e) pel && handle_failure e
|
|
|
|
| MLast.ExLid (_, _) | MLast.ExInt (_, _) | MLast.ExStr (_, _) |
|
|
|
|
MLast.ExChr (_, _) | MLast.ExFun (_, _) | MLast.ExUid (_, _) ->
|
|
|
|
true
|
|
|
|
| MLast.ExApp (_, MLast.ExLid (_, "raise"), e) ->
|
|
|
|
begin match e with
|
|
|
|
MLast.ExAcc
|
|
|
|
(_, MLast.ExUid (_, "Stream"), MLast.ExUid (_, "Failure")) ->
|
|
|
|
false
|
|
|
|
| _ -> true
|
|
|
|
end
|
|
|
|
| MLast.ExApp (_, f, x) ->
|
|
|
|
is_constr_apply f && handle_failure f && handle_failure x
|
|
|
|
| _ -> false
|
|
|
|
and is_constr_apply =
|
|
|
|
function
|
|
|
|
MLast.ExUid (_, _) -> true
|
|
|
|
| MLast.ExLid (_, _) -> false
|
|
|
|
| MLast.ExApp (_, x, _) -> is_constr_apply x
|
|
|
|
| _ -> false
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec subst v e =
|
|
|
|
let loc = MLast.loc_of_expr e in
|
|
|
|
match e with
|
|
|
|
MLast.ExLid (_, x) ->
|
|
|
|
let x = if x = v then strm_n else x in MLast.ExLid (loc, x)
|
|
|
|
| MLast.ExUid (_, _) -> e
|
|
|
|
| MLast.ExInt (_, _) -> e
|
|
|
|
| MLast.ExChr (_, _) -> e
|
|
|
|
| MLast.ExStr (_, _) -> e
|
|
|
|
| MLast.ExAcc (_, _, _) -> e
|
|
|
|
| MLast.ExLet (_, rf, pel, e) ->
|
|
|
|
MLast.ExLet (loc, rf, List.map (subst_pe v) pel, subst v e)
|
|
|
|
| MLast.ExApp (_, e1, e2) -> MLast.ExApp (loc, subst v e1, subst v e2)
|
|
|
|
| MLast.ExTup (_, el) -> MLast.ExTup (loc, List.map (subst v) el)
|
|
|
|
| _ -> raise Not_found
|
|
|
|
and subst_pe v (p, e) =
|
|
|
|
match p with
|
2001-12-22 10:29:29 -08:00
|
|
|
MLast.PaLid (_, v') when v <> v' -> p, subst v e
|
2001-09-07 00:55:07 -07:00
|
|
|
| _ -> raise Not_found
|
|
|
|
;;
|
|
|
|
|
|
|
|
let stream_pattern_component skont ckont =
|
|
|
|
function
|
|
|
|
SpTrm (loc, p, wo) ->
|
|
|
|
MLast.ExMat
|
|
|
|
(loc, MLast.ExApp (loc, peek_fun loc, MLast.ExLid (loc, strm_n)),
|
|
|
|
[MLast.PaApp (loc, MLast.PaUid (loc, "Some"), p), wo,
|
|
|
|
MLast.ExSeq
|
|
|
|
(loc,
|
|
|
|
[MLast.ExApp (loc, junk_fun loc, MLast.ExLid (loc, strm_n));
|
|
|
|
skont]);
|
|
|
|
MLast.PaAny loc, None, ckont])
|
|
|
|
| SpNtr (loc, p, e) ->
|
|
|
|
let e =
|
|
|
|
match e with
|
|
|
|
MLast.ExFun
|
|
|
|
(_,
|
|
|
|
[MLast.PaTyc
|
|
|
|
(_, MLast.PaLid (_, v),
|
|
|
|
MLast.TyApp
|
|
|
|
(_,
|
|
|
|
MLast.TyAcc
|
|
|
|
(_, MLast.TyUid (_, "Stream"), MLast.TyLid (_, "t")),
|
|
|
|
MLast.TyAny _)), None, e])
|
|
|
|
when v = strm_n ->
|
|
|
|
e
|
|
|
|
| _ -> MLast.ExApp (loc, e, MLast.ExLid (loc, strm_n))
|
|
|
|
in
|
|
|
|
if pattern_eq_expression p skont then
|
|
|
|
if is_raise_failure ckont then e
|
|
|
|
else if handle_failure e then e
|
|
|
|
else
|
|
|
|
MLast.ExTry
|
|
|
|
(loc, e,
|
|
|
|
[MLast.PaAcc
|
|
|
|
(loc, MLast.PaUid (loc, "Stream"),
|
|
|
|
MLast.PaUid (loc, "Failure")),
|
|
|
|
None, ckont])
|
|
|
|
else if is_raise_failure ckont then
|
|
|
|
MLast.ExLet (loc, false, [p, e], skont)
|
|
|
|
else if
|
|
|
|
pattern_eq_expression
|
|
|
|
(MLast.PaApp (loc, MLast.PaUid (loc, "Some"), p)) skont then
|
|
|
|
MLast.ExTry
|
|
|
|
(loc, MLast.ExApp (loc, MLast.ExUid (loc, "Some"), e),
|
|
|
|
[MLast.PaAcc
|
|
|
|
(loc, MLast.PaUid (loc, "Stream"),
|
|
|
|
MLast.PaUid (loc, "Failure")),
|
|
|
|
None, ckont])
|
|
|
|
else if is_raise ckont then
|
|
|
|
let tst =
|
|
|
|
if handle_failure e then e
|
|
|
|
else
|
|
|
|
MLast.ExTry
|
|
|
|
(loc, e,
|
|
|
|
[MLast.PaAcc
|
|
|
|
(loc, MLast.PaUid (loc, "Stream"),
|
|
|
|
MLast.PaUid (loc, "Failure")),
|
|
|
|
None, ckont])
|
|
|
|
in
|
|
|
|
MLast.ExLet (loc, false, [p, tst], skont)
|
|
|
|
else
|
|
|
|
MLast.ExMat
|
|
|
|
(loc,
|
|
|
|
MLast.ExTry
|
|
|
|
(loc, MLast.ExApp (loc, MLast.ExUid (loc, "Some"), e),
|
|
|
|
[MLast.PaAcc
|
|
|
|
(loc, MLast.PaUid (loc, "Stream"),
|
|
|
|
MLast.PaUid (loc, "Failure")),
|
|
|
|
None, MLast.ExUid (loc, "None")]),
|
|
|
|
[MLast.PaApp (loc, MLast.PaUid (loc, "Some"), p), None, skont;
|
|
|
|
MLast.PaAny loc, None, ckont])
|
|
|
|
| SpStr (loc, p) ->
|
|
|
|
try
|
|
|
|
match p with
|
|
|
|
MLast.PaLid (_, v) -> subst v skont
|
|
|
|
| _ -> raise Not_found
|
|
|
|
with
|
|
|
|
Not_found ->
|
|
|
|
MLast.ExLet (loc, false, [p, MLast.ExLid (loc, strm_n)], skont)
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec stream_pattern loc epo e ekont =
|
|
|
|
function
|
|
|
|
[] ->
|
|
|
|
begin match epo with
|
|
|
|
Some ep ->
|
|
|
|
MLast.ExLet
|
|
|
|
(loc, false,
|
|
|
|
[ep,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExLid (loc, "count")),
|
|
|
|
MLast.ExLid (loc, strm_n))],
|
|
|
|
e)
|
|
|
|
| _ -> e
|
|
|
|
end
|
|
|
|
| (spc, err) :: spcl ->
|
|
|
|
let skont =
|
|
|
|
let ekont err =
|
|
|
|
let str =
|
|
|
|
match err with
|
|
|
|
Some estr -> estr
|
|
|
|
| _ -> MLast.ExStr (loc, "")
|
|
|
|
in
|
|
|
|
MLast.ExApp
|
|
|
|
(loc, MLast.ExLid (loc, "raise"),
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExUid (loc, "Error")),
|
|
|
|
str))
|
|
|
|
in
|
|
|
|
stream_pattern loc epo e ekont spcl
|
|
|
|
in
|
|
|
|
let ckont = ekont err in stream_pattern_component skont ckont spc
|
|
|
|
;;
|
|
|
|
|
|
|
|
let stream_patterns_term loc ekont tspel =
|
|
|
|
let pel =
|
|
|
|
List.map
|
|
|
|
(fun (p, w, loc, spcl, epo, e) ->
|
|
|
|
let p = MLast.PaApp (loc, MLast.PaUid (loc, "Some"), p) in
|
|
|
|
let e =
|
|
|
|
let ekont err =
|
|
|
|
let str =
|
|
|
|
match err with
|
|
|
|
Some estr -> estr
|
|
|
|
| _ -> MLast.ExStr (loc, "")
|
|
|
|
in
|
|
|
|
MLast.ExApp
|
|
|
|
(loc, MLast.ExLid (loc, "raise"),
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExUid (loc, "Error")),
|
|
|
|
str))
|
|
|
|
in
|
|
|
|
let skont = stream_pattern loc epo e ekont spcl in
|
|
|
|
MLast.ExSeq
|
|
|
|
(loc,
|
|
|
|
[MLast.ExApp (loc, junk_fun loc, MLast.ExLid (loc, strm_n));
|
|
|
|
skont])
|
|
|
|
in
|
|
|
|
p, w, e)
|
|
|
|
tspel
|
|
|
|
in
|
|
|
|
let pel = pel @ [MLast.PaAny loc, None, ekont ()] in
|
|
|
|
MLast.ExMat
|
|
|
|
(loc, MLast.ExApp (loc, peek_fun loc, MLast.ExLid (loc, strm_n)), pel)
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec group_terms =
|
|
|
|
function
|
|
|
|
((SpTrm (loc, p, w), None) :: spcl, epo, e) :: spel ->
|
|
|
|
let (tspel, spel) = group_terms spel in
|
|
|
|
(p, w, loc, spcl, epo, e) :: tspel, spel
|
|
|
|
| spel -> [], spel
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec parser_cases loc =
|
|
|
|
function
|
|
|
|
[] ->
|
|
|
|
MLast.ExApp
|
|
|
|
(loc, MLast.ExLid (loc, "raise"),
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExUid (loc, "Failure")))
|
|
|
|
| spel ->
|
|
|
|
match group_terms spel with
|
|
|
|
[], (spcl, epo, e) :: spel ->
|
|
|
|
stream_pattern loc epo e (fun _ -> parser_cases loc spel) spcl
|
|
|
|
| tspel, spel ->
|
|
|
|
stream_patterns_term loc (fun _ -> parser_cases loc spel) tspel
|
|
|
|
;;
|
|
|
|
|
|
|
|
let cparser loc bpo pc =
|
|
|
|
let e = parser_cases loc pc in
|
|
|
|
let e =
|
|
|
|
match bpo with
|
|
|
|
Some bp ->
|
|
|
|
MLast.ExLet
|
|
|
|
(loc, false,
|
|
|
|
[bp,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExLid (loc, "count")),
|
|
|
|
MLast.ExLid (loc, strm_n))],
|
|
|
|
e)
|
|
|
|
| None -> e
|
|
|
|
in
|
|
|
|
let p =
|
|
|
|
MLast.PaTyc
|
|
|
|
(loc, MLast.PaLid (loc, strm_n),
|
|
|
|
MLast.TyApp
|
|
|
|
(loc,
|
|
|
|
MLast.TyAcc
|
|
|
|
(loc, MLast.TyUid (loc, "Stream"), MLast.TyLid (loc, "t")),
|
|
|
|
MLast.TyAny loc))
|
|
|
|
in
|
|
|
|
MLast.ExFun (loc, [p, None, e])
|
|
|
|
;;
|
|
|
|
|
|
|
|
let cparser_match loc me bpo pc =
|
|
|
|
let pc = parser_cases loc pc in
|
|
|
|
let e =
|
|
|
|
match bpo with
|
|
|
|
Some bp ->
|
|
|
|
MLast.ExLet
|
|
|
|
(loc, false,
|
|
|
|
[bp,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExLid (loc, "count")),
|
|
|
|
MLast.ExLid (loc, strm_n))],
|
|
|
|
pc)
|
|
|
|
| None -> pc
|
|
|
|
in
|
2001-10-19 03:44:23 -07:00
|
|
|
match me with
|
|
|
|
MLast.ExLid (_, x) when x = strm_n -> e
|
|
|
|
| _ ->
|
|
|
|
MLast.ExLet
|
|
|
|
(loc, false,
|
|
|
|
[MLast.PaTyc
|
|
|
|
(loc, MLast.PaLid (loc, strm_n),
|
|
|
|
MLast.TyApp
|
|
|
|
(loc,
|
|
|
|
MLast.TyAcc
|
|
|
|
(loc, MLast.TyUid (loc, "Stream"), MLast.TyLid (loc, "t")),
|
|
|
|
MLast.TyAny loc)),
|
|
|
|
me],
|
|
|
|
e)
|
2001-09-07 00:55:07 -07:00
|
|
|
;;
|
|
|
|
|
|
|
|
(* streams *)
|
|
|
|
|
|
|
|
let rec not_computing =
|
|
|
|
function
|
|
|
|
MLast.ExLid (_, _) | MLast.ExUid (_, _) | MLast.ExInt (_, _) |
|
|
|
|
MLast.ExFlo (_, _) | MLast.ExChr (_, _) | MLast.ExStr (_, _) ->
|
|
|
|
true
|
|
|
|
| MLast.ExApp (_, x, y) -> is_cons_apply_not_computing x && not_computing y
|
|
|
|
| _ -> false
|
|
|
|
and is_cons_apply_not_computing =
|
|
|
|
function
|
|
|
|
MLast.ExUid (_, _) -> true
|
|
|
|
| MLast.ExLid (_, _) -> false
|
|
|
|
| MLast.ExApp (_, x, y) -> is_cons_apply_not_computing x && not_computing y
|
|
|
|
| _ -> false
|
|
|
|
;;
|
|
|
|
|
|
|
|
let slazy loc e =
|
|
|
|
match e with
|
|
|
|
MLast.ExApp (_, f, MLast.ExUid (_, "()")) ->
|
|
|
|
begin match f with
|
|
|
|
MLast.ExLid (_, _) -> f
|
|
|
|
| _ -> MLast.ExFun (loc, [MLast.PaAny loc, None, e])
|
|
|
|
end
|
|
|
|
| _ -> MLast.ExFun (loc, [MLast.PaAny loc, None, e])
|
|
|
|
;;
|
|
|
|
|
|
|
|
let rec cstream gloc =
|
|
|
|
function
|
|
|
|
[] ->
|
|
|
|
let loc = gloc in
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "sempty"))
|
|
|
|
| [SeTrm (loc, e)] ->
|
|
|
|
if not_computing e then
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "ising")),
|
|
|
|
e)
|
|
|
|
else
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "lsing")),
|
|
|
|
slazy loc e)
|
|
|
|
| SeTrm (loc, e) :: secl ->
|
|
|
|
if not_computing e then
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExLid (loc, "icons")),
|
|
|
|
e),
|
|
|
|
cstream gloc secl)
|
|
|
|
else
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"),
|
|
|
|
MLast.ExLid (loc, "lcons")),
|
|
|
|
slazy loc e),
|
|
|
|
cstream gloc secl)
|
|
|
|
| [SeNtr (loc, e)] ->
|
|
|
|
if not_computing e then e
|
|
|
|
else
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "slazy")),
|
|
|
|
slazy loc e)
|
|
|
|
| SeNtr (loc, e) :: secl ->
|
|
|
|
if not_computing e then
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "iapp")),
|
|
|
|
e),
|
|
|
|
cstream gloc secl)
|
|
|
|
else
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExApp
|
|
|
|
(loc,
|
|
|
|
MLast.ExAcc
|
|
|
|
(loc, MLast.ExUid (loc, "Stream"), MLast.ExLid (loc, "lapp")),
|
|
|
|
slazy loc e),
|
|
|
|
cstream gloc secl)
|
|
|
|
;;
|
|
|
|
|
|
|
|
(* Syntax extensions in Revised Syntax grammar *)
|
|
|
|
|
|
|
|
Grammar.extend
|
|
|
|
(let _ = (expr : 'expr Grammar.Entry.e) in
|
|
|
|
let grammar_entry_create s =
|
|
|
|
Grammar.Entry.create (Grammar.of_entry expr) s
|
|
|
|
in
|
|
|
|
let parser_case : 'parser_case Grammar.Entry.e =
|
|
|
|
grammar_entry_create "parser_case"
|
|
|
|
and stream_patt : 'stream_patt Grammar.Entry.e =
|
|
|
|
grammar_entry_create "stream_patt"
|
|
|
|
and stream_patt_comp_err : 'stream_patt_comp_err Grammar.Entry.e =
|
|
|
|
grammar_entry_create "stream_patt_comp_err"
|
|
|
|
and stream_patt_comp : 'stream_patt_comp Grammar.Entry.e =
|
|
|
|
grammar_entry_create "stream_patt_comp"
|
|
|
|
and ipatt : 'ipatt Grammar.Entry.e = grammar_entry_create "ipatt"
|
|
|
|
and stream_expr_comp : 'stream_expr_comp Grammar.Entry.e =
|
|
|
|
grammar_entry_create "stream_expr_comp"
|
|
|
|
in
|
|
|
|
[Grammar.Entry.obj (expr : 'expr Grammar.Entry.e),
|
|
|
|
Some (Gramext.Level "top"),
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Stoken ("", "match"); Gramext.Sself;
|
|
|
|
Gramext.Stoken ("", "with"); Gramext.Stoken ("", "parser");
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e)));
|
|
|
|
Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (parser_case : 'parser_case Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (pc : 'parser_case) (po : 'ipatt option) _ _ (e : 'expr) _
|
|
|
|
(loc : int * int) ->
|
|
|
|
(cparser_match loc e po [pc] : 'expr));
|
|
|
|
[Gramext.Stoken ("", "match"); Gramext.Sself;
|
|
|
|
Gramext.Stoken ("", "with"); Gramext.Stoken ("", "parser");
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e)));
|
|
|
|
Gramext.Stoken ("", "[");
|
|
|
|
Gramext.Slist0sep
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (parser_case : 'parser_case Grammar.Entry.e)),
|
|
|
|
Gramext.Stoken ("", "|"));
|
|
|
|
Gramext.Stoken ("", "]")],
|
|
|
|
Gramext.action
|
|
|
|
(fun _ (pcl : 'parser_case list) _ (po : 'ipatt option) _ _
|
|
|
|
(e : 'expr) _ (loc : int * int) ->
|
|
|
|
(cparser_match loc e po pcl : 'expr));
|
|
|
|
[Gramext.Stoken ("", "parser");
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e)));
|
|
|
|
Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (parser_case : 'parser_case Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (pc : 'parser_case) (po : 'ipatt option) _ (loc : int * int) ->
|
|
|
|
(cparser loc po [pc] : 'expr));
|
|
|
|
[Gramext.Stoken ("", "parser");
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e)));
|
|
|
|
Gramext.Stoken ("", "[");
|
|
|
|
Gramext.Slist0sep
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (parser_case : 'parser_case Grammar.Entry.e)),
|
|
|
|
Gramext.Stoken ("", "|"));
|
|
|
|
Gramext.Stoken ("", "]")],
|
|
|
|
Gramext.action
|
|
|
|
(fun _ (pcl : 'parser_case list) _ (po : 'ipatt option) _
|
|
|
|
(loc : int * int) ->
|
|
|
|
(cparser loc po pcl : 'expr))]];
|
|
|
|
Grammar.Entry.obj (parser_case : 'parser_case Grammar.Entry.e), None,
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Stoken ("", "[:");
|
|
|
|
Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (stream_patt : 'stream_patt Grammar.Entry.e));
|
|
|
|
Gramext.Stoken ("", ":]");
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e)));
|
|
|
|
Gramext.Stoken ("", "->");
|
|
|
|
Gramext.Snterm (Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) _ (po : 'ipatt option) _ (sp : 'stream_patt) _
|
|
|
|
(loc : int * int) ->
|
|
|
|
(sp, po, e : 'parser_case))]];
|
|
|
|
Grammar.Entry.obj (stream_patt : 'stream_patt Grammar.Entry.e), None,
|
|
|
|
[None, None,
|
|
|
|
[[], Gramext.action (fun (loc : int * int) -> ([] : 'stream_patt));
|
|
|
|
[Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj
|
|
|
|
(stream_patt_comp : 'stream_patt_comp Grammar.Entry.e));
|
|
|
|
Gramext.Stoken ("", ";");
|
|
|
|
Gramext.Slist1sep
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj
|
|
|
|
(stream_patt_comp_err :
|
|
|
|
'stream_patt_comp_err Grammar.Entry.e)),
|
|
|
|
Gramext.Stoken ("", ";"))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (sp : 'stream_patt_comp_err list) _ (spc : 'stream_patt_comp)
|
|
|
|
(loc : int * int) ->
|
|
|
|
((spc, None) :: sp : 'stream_patt));
|
|
|
|
[Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj
|
|
|
|
(stream_patt_comp : 'stream_patt_comp Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (spc : 'stream_patt_comp) (loc : int * int) ->
|
|
|
|
([spc, None] : 'stream_patt))]];
|
|
|
|
Grammar.Entry.obj
|
|
|
|
(stream_patt_comp_err : 'stream_patt_comp_err Grammar.Entry.e),
|
|
|
|
None,
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj
|
|
|
|
(stream_patt_comp : 'stream_patt_comp Grammar.Entry.e));
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.srules
|
|
|
|
[[Gramext.Stoken ("", "?");
|
|
|
|
Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) _ (loc : int * int) -> (e : 'e__1))])],
|
|
|
|
Gramext.action
|
|
|
|
(fun (eo : 'e__1 option) (spc : 'stream_patt_comp)
|
|
|
|
(loc : int * int) ->
|
|
|
|
(spc, eo : 'stream_patt_comp_err))]];
|
|
|
|
Grammar.Entry.obj (stream_patt_comp : 'stream_patt_comp Grammar.Entry.e),
|
|
|
|
None,
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Snterm (Grammar.Entry.obj (patt : 'patt Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (p : 'patt) (loc : int * int) ->
|
|
|
|
(SpStr (loc, p) : 'stream_patt_comp));
|
|
|
|
[Gramext.Snterm (Grammar.Entry.obj (patt : 'patt Grammar.Entry.e));
|
|
|
|
Gramext.Stoken ("", "=");
|
|
|
|
Gramext.Snterm (Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) _ (p : 'patt) (loc : int * int) ->
|
|
|
|
(SpNtr (loc, p, e) : 'stream_patt_comp));
|
|
|
|
[Gramext.Stoken ("", "`");
|
|
|
|
Gramext.Snterm (Grammar.Entry.obj (patt : 'patt Grammar.Entry.e));
|
|
|
|
Gramext.Sopt
|
|
|
|
(Gramext.srules
|
|
|
|
[[Gramext.Stoken ("", "when");
|
|
|
|
Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) _ (loc : int * int) -> (e : 'e__2))])],
|
|
|
|
Gramext.action
|
|
|
|
(fun (eo : 'e__2 option) (p : 'patt) _ (loc : int * int) ->
|
|
|
|
(SpTrm (loc, p, eo) : 'stream_patt_comp))]];
|
|
|
|
Grammar.Entry.obj (ipatt : 'ipatt Grammar.Entry.e), None,
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Stoken ("LIDENT", "")],
|
|
|
|
Gramext.action
|
|
|
|
(fun (i : string) (loc : int * int) ->
|
|
|
|
(MLast.PaLid (loc, i) : 'ipatt))]];
|
|
|
|
Grammar.Entry.obj (expr : 'expr Grammar.Entry.e),
|
|
|
|
Some (Gramext.Level "simple"),
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Stoken ("", "[:");
|
|
|
|
Gramext.Slist0sep
|
|
|
|
(Gramext.Snterm
|
|
|
|
(Grammar.Entry.obj
|
|
|
|
(stream_expr_comp : 'stream_expr_comp Grammar.Entry.e)),
|
|
|
|
Gramext.Stoken ("", ";"));
|
|
|
|
Gramext.Stoken ("", ":]")],
|
|
|
|
Gramext.action
|
|
|
|
(fun _ (se : 'stream_expr_comp list) _ (loc : int * int) ->
|
|
|
|
(cstream loc se : 'expr))]];
|
|
|
|
Grammar.Entry.obj (stream_expr_comp : 'stream_expr_comp Grammar.Entry.e),
|
|
|
|
None,
|
|
|
|
[None, None,
|
|
|
|
[[Gramext.Snterm (Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) (loc : int * int) ->
|
|
|
|
(SeNtr (loc, e) : 'stream_expr_comp));
|
|
|
|
[Gramext.Stoken ("", "`");
|
|
|
|
Gramext.Snterm (Grammar.Entry.obj (expr : 'expr Grammar.Entry.e))],
|
|
|
|
Gramext.action
|
|
|
|
(fun (e : 'expr) _ (loc : int * int) ->
|
|
|
|
(SeTrm (loc, e) : 'stream_expr_comp))]]]);;
|