summaryrefslogtreecommitdiff
path: root/src/rewriter.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/rewriter.ml')
-rw-r--r--src/rewriter.ml13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/rewriter.ml b/src/rewriter.ml
index 1fb89dee..1fa3bc67 100644
--- a/src/rewriter.ml
+++ b/src/rewriter.ml
@@ -291,6 +291,8 @@ let rewrite_pat rewriters (P_aux (pat,(l,annot)) as orig_pat) =
(vector_string_to_bit_list l lit) in
rewrap (P_vector ps)
| P_lit _ | P_wild | P_id _ | P_var _ -> rewrap pat
+ | P_or(pat1, pat2) -> rewrap (P_or(rewrite pat1, rewrite pat2))
+ | P_not(pat) -> rewrap (P_not(rewrite pat))
| P_as(pat,id) -> rewrap (P_as(rewrite pat, id))
| P_typ(typ,pat) -> rewrap (P_typ(typ, rewrite pat))
| P_app(id ,pats) -> rewrap (P_app(id, List.map rewrite pats))
@@ -440,6 +442,8 @@ and introduced_vars_le (LEXP_aux(lexp,annot)) exp =
type ('a,'pat,'pat_aux,'fpat,'fpat_aux) pat_alg =
{ p_lit : lit -> 'pat_aux
; p_wild : 'pat_aux
+ ; p_or : 'pat * 'pat -> 'pat_aux
+ ; p_not : 'pat -> 'pat_aux
; p_as : 'pat * id -> 'pat_aux
; p_typ : Ast.typ * 'pat -> 'pat_aux
; p_id : id -> 'pat_aux
@@ -461,6 +465,8 @@ let rec fold_pat_aux (alg : ('a,'pat,'pat_aux,'fpat,'fpat_aux) pat_alg) : 'a pat
function
| P_lit lit -> alg.p_lit lit
| P_wild -> alg.p_wild
+ | P_or(p1, p2) -> alg.p_or (fold_pat alg p1, fold_pat alg p2)
+ | P_not(p) -> alg.p_not (fold_pat alg p)
| P_id id -> alg.p_id id
| P_var (p,tpat) -> alg.p_var (fold_pat alg p, tpat)
| P_as (p,id) -> alg.p_as (fold_pat alg p, id)
@@ -488,6 +494,8 @@ and fold_fpat (alg : ('a,'pat,'pat_aux,'fpat,'fpat_aux) pat_alg) : 'a fpat -> 'f
let id_pat_alg : ('a,'a pat, 'a pat_aux, 'a fpat, 'a fpat_aux) pat_alg =
{ p_lit = (fun lit -> P_lit lit)
; p_wild = P_wild
+ ; p_or = (fun (pat1, pat2) -> P_or(pat1, pat2))
+ ; p_not = (fun pat -> P_not(pat))
; p_as = (fun (pat,id) -> P_as (pat,id))
; p_typ = (fun (typ,pat) -> P_typ (typ,pat))
; p_id = (fun id -> P_id id)
@@ -721,6 +729,9 @@ let compute_pat_alg bot join =
let split_join f ps = let (vs,ps) = List.split ps in (join_list vs, f ps) in
{ p_lit = (fun lit -> (bot, P_lit lit))
; p_wild = (bot, P_wild)
+ (* todo: I have no idea how to combine v1 and v2 in the following *)
+ ; p_or = (fun ((v1, pat1), (v2, pat2)) -> (v1, P_or(pat1, pat2)))
+ ; p_not = (fun (v, pat) -> (v, P_not(pat)))
; p_as = (fun ((v,pat),id) -> (v, P_as (pat,id)))
; p_typ = (fun (typ,(v,pat)) -> (v, P_typ (typ,pat)))
; p_id = (fun id -> (bot, P_id id))
@@ -823,6 +834,8 @@ let pure_pat_alg bot join =
let join_list vs = List.fold_left join bot vs in
{ p_lit = (fun lit -> bot)
; p_wild = bot
+ ; p_or = (fun (pat1, pat2) -> bot) (* todo: this is wrong *)
+ ; p_not = (fun pat -> bot) (* todo: this is wrong *)
; p_as = (fun (v,id) -> v)
; p_typ = (fun (typ,v) -> v)
; p_id = (fun id -> bot)