| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- open Match
- open Fuzz
- open Cgen
- (* unit tests *)
- let test_pattern_match =
- let pm = pattern_match
- and nm = fun x y -> not (pattern_match x y) in
- begin
- assert (nm (Atm Tmp) (Atm (Con 42L)));
- assert (pm (Atm AnyCon) (Atm (Con 42L)));
- assert (nm (Atm (Con 42L)) (Atm AnyCon));
- assert (nm (Atm (Con 42L)) (Atm Tmp));
- end
- let test_peel =
- let o = Kw, Oadd in
- let p = Bnr (o, Bnr (o, Atm Tmp, Atm Tmp),
- Atm (Con 42L)) in
- let l = peel p () in
- let () = assert (List.length l = 3) in
- let atomic_p (p, _) =
- match p with Atm _ -> true | _ -> false in
- let () = assert (List.for_all atomic_p l) in
- let l = List.map (fun (p, c) -> fold_cursor c p) l in
- let () = assert (List.for_all ((=) p) l) in
- ()
- let test_fold_pairs =
- let l = [1; 2; 3; 4; 5] in
- let p = fold_pairs l l [] (fun a b -> a :: b) in
- let () = assert (List.length p = 25) in
- let p = sort_uniq compare p in
- let () = assert (List.length p = 25) in
- ()
- (* test pattern & state *)
- let print_sm oc =
- StateMap.iter (fun k s' ->
- match k with
- | K (o, sl, sr) ->
- let top =
- List.fold_left (fun top c ->
- match c with
- | Top r -> top ^ " " ^ r
- | _ -> top) "" s'.point
- in
- Printf.fprintf oc
- " (%s %d %d) -> %d%s\n"
- (show_op o)
- sl.id sr.id s'.id top)
- let rules =
- let oa = Kl, Oadd in
- let om = Kl, Omul in
- let va = Var ("a", Tmp)
- and vb = Var ("b", Tmp)
- and vc = Var ("c", Tmp)
- and vs = Var ("s", Tmp) in
- let vars = ["a"; "b"; "c"; "s"] in
- let rule name pattern =
- List.map
- (fun pattern -> {name; vars; pattern})
- (ac_equiv pattern)
- in
- match `X64Addr with
- (* ------------------------------- *)
- | `X64Addr ->
- (* o + b *)
- rule "ob" (Bnr (oa, Atm Tmp, Atm AnyCon))
- @ (* b + s * m *)
- rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 2L), vs)))
- @
- rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 4L), vs)))
- @
- rule "bsm" (Bnr (oa, vb, Bnr (om, Var ("m", Con 8L), vs)))
- @ (* b + s *)
- rule "bs1" (Bnr (oa, vb, vs))
- @ (* o + s * m *)
- (* rule "osm" (Bnr (oa, Atm AnyCon, Bnr (om, Atm (Con 4L), Atm Tmp))) *) []
- @ (* o + b + s *)
- rule "obs1" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb), vs))
- @ (* o + b + s * m *)
- rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
- Bnr (om, Var ("m", Con 2L), vs)))
- @
- rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
- Bnr (om, Var ("m", Con 4L), vs)))
- @
- rule "obsm" (Bnr (oa, Bnr (oa, Var ("o", AnyCon), vb),
- Bnr (om, Var ("m", Con 8L), vs)))
- (* ------------------------------- *)
- | `Add3 ->
- [ { name = "add"
- ; vars = []
- ; pattern = Bnr (oa, va, Bnr (oa, vb, vc)) } ] @
- [ { name = "add"
- ; vars = []
- ; pattern = Bnr (oa, Bnr (oa, va, vb), vc) } ]
- (*
- let sa, am, sm = generate_table rules
- let () =
- Array.iteri (fun i s ->
- Format.printf "@[state %d: %s@]@."
- i (show_pattern s.seen))
- sa
- let () = print_sm stdout sm; flush stdout
- let matcher = lr_matcher sm sa rules "obsm" (* XXX *)
- let () = Format.printf "@[<v>%a@]@." Action.pp matcher
- let () = Format.printf "@[matcher size: %d@]@." (Action.size matcher)
- let numbr = make_numberer sa am sm
- let () =
- let opts = { pfx = ""
- ; static = true
- ; oc = stdout } in
- emit_c opts numbr;
- emit_matchers opts
- [ ( ["b"; "o"; "s"; "m"]
- , "obsm"
- , matcher ) ]
- (*
- let tp = fuzz_numberer rules numbr
- let () = test_matchers tp numbr rules
- *)
- *)
|