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 =