1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
(**************************************************************************)
(* *)
(* The Why platform for program certification *)
(* Copyright (C) 2002-2008 *)
(* Romain BARDOU *)
(* Jean-Franois COUCHOT *)
(* Mehdi DOGGUY *)
(* Jean-Christophe FILLITRE *)
(* Thierry HUBERT *)
(* Claude MARCH *)
(* Yannick MOY *)
(* Christine PAULIN *)
(* Yann RGIS-GIANAS *)
(* Nicolas ROUSSET *)
(* Xavier URBAIN *)
(* *)
(* This software is free software; you can redistribute it and/or *)
(* modify it under the terms of the GNU General Public *)
(* License version 2, as published by the Free Software Foundation. *)
(* *)
(* This software is distributed in the hope that it will be useful, *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *)
(* *)
(* See the GNU General Public License version 2 for more details *)
(* (enclosed in the file GPL). *)
(* *)
(**************************************************************************)
(*i $Id: simplify_split.mll,v 1.9 2008/02/05 12:10:50 marche Exp $ i*)
{
open Printf
open Lexing
let debug = ref false
let callback = ref (fun f -> assert false)
(* we put everything not a goal into [buf] *)
let buf = Buffer.create 8192
let outc = ref stdout
let print s = output_string !outc s
let start_file () =
let f = Filename.temp_file "simplify" ".sx" in
outc := open_out f;
print (Buffer.contents buf);
f
let end_file file =
close_out !outc;
!callback file;
if not !debug then Sys.remove file
}
let space = [' ' '\t' '\n' '\r']
let ident = ['a'-'z' 'A'-'Z']+
rule split = parse
| ";" [^'\n']* '\n'
{ Buffer.add_string buf (lexeme lexbuf); split lexbuf }
| "(" space* ("BG_PUSH" | "DEFPRED")
{ Buffer.add_string buf (lexeme lexbuf);
lisp_copy lexbuf; split lexbuf }
| ident
{ let file = start_file () in
print (lexeme lexbuf); end_file file; split lexbuf }
| "("
{ let file = start_file () in
print (lexeme lexbuf); query lexbuf; end_file file; split lexbuf }
| eof
{ () }
| _
{ Buffer.add_string buf (lexeme lexbuf); split lexbuf }
(* copies into [buf] until the end of the S-expression *)
and lisp_copy = parse
| "(" { Buffer.add_char buf '('; lisp_copy lexbuf; lisp_copy lexbuf }
| ")" { Buffer.add_char buf ')' }
| ";" [^'\n']* '\n'
{ Buffer.add_string buf (lexeme lexbuf); lisp_copy lexbuf }
| eof { () }
| _ { Buffer.add_string buf (lexeme lexbuf); lisp_copy lexbuf }
(* prints up to the end of the S-expression *)
and query = parse
| ")" { print ")" }
| "(" { print "("; query lexbuf; query lexbuf }
| ";" [^'\n']* '\n'
{ print (lexeme lexbuf); query lexbuf }
| eof { () }
| _ { print (lexeme lexbuf); query lexbuf }
{
let iter cb f =
callback := cb;
Buffer.reset buf;
let c = open_in f in
let lb = from_channel c in
split lb;
close_in c
}
|