module Ast = GrafiteAst
module Pt = CicNotationPt
+let error_token = "O"
+let error_token_len = String.length error_token
+
let has_toplevel_term = function
| GrafiteParser.LSome (Ast.Executable (_, Ast.Command (_, Ast.Obj (loc, (
Pt.Theorem ((`Definition | `Lemma | `Theorem), _, _, _)
(sanitize_tokens tokens) in
List.nth idents (Random.int (List.length idents))
in
+ let start_pos, end_pos =
+ Glib.Utf8.offset_to_pos statement 0 (Ploc.first_pos target_pos),
+ Glib.Utf8.offset_to_pos statement 0 (Ploc.last_pos target_pos) in
let statement' =
(* positions in bytecount *)
- let start_pos, end_pos =
- Glib.Utf8.offset_to_pos statement 0 (Ploc.first_pos target_pos),
- Glib.Utf8.offset_to_pos statement 0 (Ploc.last_pos target_pos) in
String.sub statement 0 start_pos
- ^ "true"
- ^ String.sub statement end_pos (String.length statement - end_pos)
- in
+ ^ "O"
+ ^ String.sub statement end_pos (String.length statement - end_pos) in
let script = HExtlib.input_file fname in
- let script' =
- Pcre.replace ~pat:(Pcre.quote statement) ~templ:statement' script in
+ let matches =
+ let rex =
+ Pcre.regexp ~flags:[`DOTALL]
+ (sprintf "^(.*)(%s)(.*)$" (Pcre.quote statement)) in
+ try
+ Pcre.extract ~rex script
+ with Not_found -> assert false
+ in
+ let trailer = (* trailing comment with machine parseable error location *)
+ let preamble_len = String.length matches.(1) in
+ sprintf "\n(*\nerror-at: %d-%d\n*)\n" (preamble_len + start_pos)
+ (preamble_len + start_pos + error_token_len) in
+ let script' = sprintf "%s%s%s%s" matches.(1) statement' matches.(3) trailer in
let md5 = Digest.to_hex (Digest.string script') in
HExtlib.output_file
~filename:(sprintf "%s.rottened.%s.ma" (Filename.chop_extension fname) md5)