blob: fed337ab03afd585884ec13d1ba9bb0e443ce7fc (
plain)
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
|
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
{
open Pcoq
open Pcoq.Prim
open Tok
open Util
open Vernacexpr
(* Vernaculars specific to the toplevel *)
type vernac_toplevel =
| VernacBacktrack of int * int * int
| VernacDrop
| VernacQuit
| VernacControl of vernac_control
| VernacShowGoal of { gid : int; sid: int }
module Toplevel_ : sig
val vernac_toplevel : vernac_toplevel option Entry.t
end = struct
let gec_vernac s = Entry.create ("toplevel:" ^ s)
let vernac_toplevel = gec_vernac "vernac_toplevel"
end
open Toplevel_
let err () = raise Stream.Failure
let test_show_goal =
Pcoq.Entry.of_parser "test_show_goal"
(fun strm ->
match stream_nth 0 strm with
| IDENT "Show" ->
(match stream_nth 1 strm with
| IDENT "Goal" ->
(match stream_nth 2 strm with
| NUMERAL _ -> ()
| _ -> err ())
| _ -> err ())
| _ -> err ())
}
GRAMMAR EXTEND Gram
GLOBAL: vernac_toplevel;
vernac_toplevel: FIRST
[ [ IDENT "Drop"; "." -> { Some VernacDrop }
| IDENT "Quit"; "." -> { Some VernacQuit }
| IDENT "Backtrack"; n = natural ; m = natural ; p = natural; "." ->
{ Some (VernacBacktrack (n,m,p)) }
(* show a goal for the specified proof state *)
| test_show_goal; IDENT "Show"; IDENT "Goal"; gid = natural; IDENT "at"; sid = natural; "." ->
{ Some (VernacShowGoal {gid; sid}) }
| cmd = Pvernac.Vernac_.main_entry ->
{ match cmd with
| None -> None
| Some v -> Some (VernacControl v) }
]
]
;
END
{
let vernac_toplevel pm =
Pvernac.Unsafe.set_tactic_entry pm;
vernac_toplevel
}
|