open Printf
open DisambiguateTypes
-exception Parse_error of string
+exception Parse_error of Token.flocation * string
let fresh_num_instance =
let n = ref 0 in
[ num = NUM ->
try
int_of_string num
- with Failure _ ->
- let (x, y) = CicAst.loc_of_floc loc in
- raise (Parse_error (sprintf
- "integer literal expected at characters %d-%d" x y))
+ with Failure _ -> raise (Parse_error (loc, "integer literal expected"))
]
];
meta_subst: [
(head, vars)
]
];
+ constructor: [ [ name = IDENT; SYMBOL ":"; typ = term -> (name, typ) ] ];
term0: [ [ t = term; EOI -> return_term loc t ] ];
term:
[ "letin" NONA
| flavour = theorem_flavour; name = OPT IDENT; SYMBOL ":"; typ = term;
body = OPT [ SYMBOL <:unicode<def>> (* ≝ *); body = term -> body ] ->
return_command loc (TacticAst.Theorem (flavour, name, typ, body))
+ | [ IDENT "inductive" | IDENT "Inductive" ]; fst_name = IDENT;
+ params = LIST0 [
+ PAREN "("; names = LIST1 IDENT SEP SYMBOL ","; SYMBOL ":";
+ typ = term; PAREN ")" -> (names, typ) ];
+ SYMBOL ":"; fst_typ = term; SYMBOL <:unicode<def>>; OPT SYMBOL "|";
+ fst_constructors = LIST0 constructor SEP SYMBOL "|" ->
+ let params =
+ List.fold_right
+ (fun (names, typ) acc ->
+ (List.map (fun name -> (name, typ)) names) @ acc)
+ params []
+ in
+ let fst_ind_type = (fst_name, true, fst_typ, fst_constructors) in
+ let ind_types = [fst_ind_type] in
+ return_command loc (TacticAst.Inductive (params, ind_types))
| [ IDENT "goal" | IDENT "Goal" ]; typ = term;
body = OPT [ SYMBOL <:unicode<def>> (* ≝ *); body = term -> body ] ->
return_command loc (TacticAst.Theorem (`Goal, None, typ, body))
let exc_located_wrapper f =
try
- Lazy.force f
- with Stdpp.Exc_located (floc, exn) ->
- let (x, y) = CicAst.loc_of_floc floc in
- raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
- (Printexc.to_string exn)))
+ f ()
+ with
+ | Stdpp.Exc_located (floc, Stream.Error msg) ->
+ raise (Parse_error (floc, msg))
+ | Stdpp.Exc_located (floc, exn) ->
+ raise (Parse_error (floc, (Printexc.to_string exn)))
let parse_term stream =
- exc_located_wrapper (lazy (Grammar.Entry.parse term0 stream))
+ exc_located_wrapper (fun () -> (Grammar.Entry.parse term0 stream))
let parse_tactic stream =
- exc_located_wrapper (lazy (Grammar.Entry.parse tactic stream))
+ exc_located_wrapper (fun () -> (Grammar.Entry.parse tactic stream))
let parse_tactical stream =
- exc_located_wrapper (lazy (Grammar.Entry.parse tactical0 stream))
+ exc_located_wrapper (fun () -> (Grammar.Entry.parse tactical0 stream))
(**/**)
if s = empty then
Environment.empty
else
- try
- Grammar.Entry.parse aliases (Stream.of_string s)
- with Stdpp.Exc_located (floc, exn) ->
- let (x, y) = CicAst.loc_of_floc floc in
- raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
- (Printexc.to_string exn)))
+ exc_located_wrapper
+ (fun () -> Grammar.Entry.parse aliases (Stream.of_string s))
end
(* vim:set encoding=utf8: *)
* http://helm.cs.unibo.it/
*)
+open Printf
+
let pp_tactical = TacticAst2Box.tacticalPp
let mode =
let ic = stdin in
try
while true do
+ let line = input_line ic in
+ let istream = Stream.of_string line in
try
- let line = input_line ic in
- let istream = Stream.of_string line in
(match mode with
| `Term ->
let term = CicTextualParser2.parse_term istream in
print_endline (CicTextualParser2.EnvironmentP3.to_string env));
flush stdout
with
- | CicTextualParser2.Parse_error msg -> prerr_endline msg
-(*
- | Stdpp.Exc_located ((p_start, p_end), exn) ->
- prerr_endline (Printf.sprintf "Exception at character %d-%d: %s"
- p_start p_end (Printexc.to_string exn))
-*)
+ | CicTextualParser2.Parse_error (floc, msg) ->
+ let (x, y) = CicAst.loc_of_floc floc in
+ let before = String.sub line 0 x in
+ let error = String.sub line x (y - x) in
+ let after = String.sub line y (String.length line - y) in
+ eprintf "%s\e[01;31m%s\e[00m%s\n" before error after;
+ prerr_endline (sprintf "at character %d-%d: %s" x y msg)
done
with End_of_file ->
close_in ic