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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
(**************************************************************************)
(* *)
(* 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). *)
(* *)
(**************************************************************************)
{
open Printf
open Lexing
let debug = ref true
let callback = ref (fun f -> assert false : string -> unit)
(* we put everything not a goal into [buf] *)
let buf = Buffer.create 8192
let outc = ref stdout
let file = ref ""
let level = ref 0
let print s =
output_string !outc s
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' '0'-'9']+
rule split = parse
| "(" space* "(theory" space* "(extends)"
{
Buffer.add_string buf (lexeme lexbuf) ;
split lexbuf
}
| ";;" space*"Why axiom"
{
Buffer.add_string buf ";;" ;
splitAxiom lexbuf;
split lexbuf
}
| "))" space* ")" space*";;" space* "END THEORY"
{
Buffer.add_string buf (lexeme lexbuf);
split lexbuf
}
| ";;" space* "Why obligation"
{
file := Filename.temp_file "rv" ".rv";
level := 0 ;
outc := open_out !file;
print (Buffer.contents buf);
print (lexeme lexbuf);
query lexbuf;
end_file !file;
split lexbuf
}
| eof {()}
|_
{
Buffer.add_string buf (lexeme lexbuf) ;
split lexbuf}
and splitAxiom = parse
| "(" { Buffer.add_char buf '(';
level := !level + 1 ;
splitAxiom lexbuf;
}
| ")" { Buffer.add_char buf ')';
level := !level - 1 ;
if !level <> 0 then splitAxiom lexbuf
}
| _ { Buffer.add_string buf (lexeme lexbuf);
splitAxiom lexbuf }
and query = parse
| "(" { print "(";
level := !level + 1 ;
query lexbuf;}
| ")" { print ")" ;
level := !level - 1 ;
if !level <> 0 then query lexbuf
}
| _ { 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
}
|