]> matita.cs.unibo.it Git - helm.git/commitdiff
avoid rottening of constructor names in pattern matchings
authorStefano Zacchiroli <zack@upsilon.cc>
Tue, 27 Nov 2007 11:19:14 +0000 (11:19 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Tue, 27 Nov 2007 11:19:14 +0000 (11:19 +0000)
helm/software/matita/rottener.ml

index 9888e11e7ddf4ac4137c09e93e76e3d543cb366c..82f4d5947300cb9272c7c20d8adf09398db28c52 100644 (file)
@@ -59,22 +59,32 @@ let rotten_script ~fname statement =
     lexer.Token.tok_func (Obj.magic (Ulexing.from_utf8_string statement)) in
   let tokens = flush_token_stream (token_stream, loc_func) in
   let target_token, target_pos =
-    let rec sanitize_tokens = function
-      | [] -> []
+    let rec sanitize_tokens acc = function
+      | [] -> List.rev acc
       | (("IDENT",
           ("theorem" | "definition" | "lemma" | "record" | "inductive")), _)
-        :: (("IDENT", _), _) :: tl
+        :: (("IDENT", _), _) :: tl ->
+          (* avoid rottening of object names *)
+          sanitize_tokens acc tl
       | (("SYMBOL", ("∀" | "λ" | "Π")), _) :: (("IDENT", _), _) :: tl ->
+          (* avoid rottening of binders *)
           let rec remove_args = function
             | (("SYMBOL", ","), _) :: (("IDENT", _), _) :: tl ->
                 remove_args tl
             | tl -> tl in
-          let tl' = remove_args tl in
-          sanitize_tokens tl'
-      | hd :: tl -> hd :: sanitize_tokens tl in
+          sanitize_tokens acc (remove_args tl)
+      | (("SYMBOL", "⇒"), _) as hd :: tl ->
+          (* avoid rottening of constructor names in pattern matching *)
+          let rec remove_until_branch_start = function
+            | (("SYMBOL", ("|" | "[")), _) :: tl -> tl
+            | hd :: tl -> remove_until_branch_start tl
+            | [] -> [] in
+          sanitize_tokens (hd :: remove_until_branch_start acc) tl
+      | hd :: tl -> (* every other identfier can be rottened! *)
+          sanitize_tokens (hd :: acc) tl in
     let idents =
       List.filter (function (("IDENT", _), _) -> true | _ -> false)
-        (sanitize_tokens tokens) in
+        (sanitize_tokens [] tokens) in
     List.nth idents (Random.int (List.length idents))
   in
   let start_pos, end_pos =