1 (* Copyright (C) 2005, HELM Team.
3 * This file is part of HELM, an Hypertextual, Electronic
4 * Library of Mathematics, developed at the Computer Science
5 * Department, University of Bologna, Italy.
7 * HELM is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * HELM is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HELM; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
22 * For details, see the HELM World-Wide-Web page,
23 * http://helm.cs.unibo.it/
29 let set_callback f = out := f
31 module Ast = CicNotationPt
33 exception NoInclusionPerformed of string (* full path *)
35 type 'a localized_option =
37 | LNone of GrafiteAst.loc
40 (CicNotationPt.term, CicNotationPt.term,
41 CicNotationPt.term GrafiteAst.reduction,
42 CicNotationPt.term CicNotationPt.obj, string)
46 ?never_include:bool ->
47 include_paths:string list ->
48 LexiconEngine.status ->
49 LexiconEngine.status * ast_statement localized_option
51 type parser_status = {
53 term : CicNotationPt.term Grammar.Entry.e;
54 statement : statement Grammar.Entry.e;
57 let initial_parser () =
58 let grammar = CicNotationParser.level2_ast_grammar () in
59 let term = CicNotationParser.term () in
60 let statement = Grammar.Entry.create grammar "statement" in
61 { grammar = grammar; term = term; statement = statement }
64 let grafite_parser = ref (initial_parser ())
66 let add_raw_attribute ~text t = Ast.AttributedTerm (`Raw text, t)
68 let default_associativity = Gramext.NonA
70 let mk_rec_corec ind_kind defs loc =
71 (* In case of mutual definitions here we produce just
72 the syntax tree for the first one. The others will be
73 generated from the completely specified term just before
74 insertion in the environment. We use the flavour
75 `MutualDefinition to rememer this. *)
78 | (params,(Ast.Ident (name, None), Some ty),_,_) :: _ ->
81 (fun var ty -> Ast.Binder (`Pi,var,ty)
85 | (_,(Ast.Ident (name, None), None),_,_) :: _ ->
89 let body = Ast.Ident (name,None) in
91 if List.length defs = 1 then
96 GrafiteAst.Obj (loc, Ast.Theorem(flavour, name, ty,
97 Some (Ast.LetRec (ind_kind, defs, body))))
99 type by_continuation =
101 | BYC_weproved of CicNotationPt.term * string option * CicNotationPt.term option
102 | BYC_letsuchthat of string * CicNotationPt.term * string * CicNotationPt.term
103 | BYC_wehaveand of string * CicNotationPt.term * string * CicNotationPt.term
105 let initialize_parser () =
106 (* {{{ parser initialization *)
107 let term = !grafite_parser.term in
108 let statement = !grafite_parser.statement in
109 let let_defs = CicNotationParser.let_defs () in
110 let protected_binder_vars = CicNotationParser.protected_binder_vars () in
112 GLOBAL: term statement;
113 constructor: [ [ name = IDENT; SYMBOL ":"; typ = term -> (name, typ) ] ];
114 tactic_term: [ [ t = term LEVEL "90" -> t ] ];
116 [ id = IDENT -> Some id
117 | SYMBOL "_" -> None ]
119 ident_list0: [ [ LPAREN; idents = LIST0 new_name; RPAREN -> idents ] ];
121 [ tactic_terms = LIST1 tactic_term SEP SYMBOL "," -> tactic_terms ]
124 [ IDENT "normalize" -> `Normalize
125 | IDENT "simplify" -> `Simpl
126 | IDENT "unfold"; t = OPT tactic_term -> `Unfold t
127 | IDENT "whd" -> `Whd ]
129 sequent_pattern_spec: [
133 path = OPT [SYMBOL ":" ; path = tactic_term -> path ] ->
134 (id,match path with Some p -> p | None -> Ast.UserInput) ];
135 goal_path = OPT [ SYMBOL <:unicode<vdash>>; term = tactic_term -> term ] ->
137 match goal_path, hyp_paths with
138 None, [] -> Some Ast.UserInput
140 | Some goal_path, _ -> Some goal_path
149 [ "match" ; wanted = tactic_term ;
150 sps = OPT [ "in"; sps = sequent_pattern_spec -> sps ] ->
152 | sps = sequent_pattern_spec ->
155 let wanted,hyp_paths,goal_path =
156 match wanted_and_sps with
157 wanted,None -> wanted, [], Some Ast.UserInput
158 | wanted,Some (hyp_paths,goal_path) -> wanted,hyp_paths,goal_path
160 wanted, hyp_paths, goal_path ] ->
162 None -> None,[],Some Ast.UserInput
166 [ SYMBOL ">" -> `LeftToRight
167 | SYMBOL "<" -> `RightToLeft ]
169 int: [ [ num = NUMBER -> int_of_string num ] ];
171 [ idents = OPT ident_list0 ->
172 match idents with None -> [] | Some idents -> idents
176 [ OPT [ IDENT "names" ];
177 num = OPT [ num = int -> num ];
178 idents = intros_names ->
182 using: [ [ using = OPT [ IDENT "using"; t = tactic_term -> t ] -> using ] ];
184 [ IDENT "napply"; t = tactic_term -> GrafiteAst.NApply (loc, t)
185 | IDENT "nchange"; what = tactic_term; with_what = tactic_term ->
186 GrafiteAst.NChange (loc, what, with_what)
190 [ IDENT "absurd"; t = tactic_term ->
191 GrafiteAst.Absurd (loc, t)
192 | IDENT "apply"; IDENT "rule"; t = tactic_term ->
193 GrafiteAst.ApplyRule (loc, t)
194 | IDENT "apply"; t = tactic_term ->
195 GrafiteAst.Apply (loc, t)
196 | IDENT "applyP"; t = tactic_term ->
197 GrafiteAst.ApplyP (loc, t)
198 | IDENT "applyS"; t = tactic_term ; params = auto_params ->
199 GrafiteAst.ApplyS (loc, t, params)
200 | IDENT "assumption" ->
201 GrafiteAst.Assumption loc
202 | IDENT "autobatch"; params = auto_params ->
203 GrafiteAst.AutoBatch (loc,params)
204 | IDENT "cases"; what = tactic_term;
205 pattern = OPT pattern_spec;
206 specs = intros_spec ->
207 let pattern = match pattern with
208 | None -> None, [], Some Ast.UserInput
209 | Some pattern -> pattern
211 GrafiteAst.Cases (loc, what, pattern, specs)
212 | IDENT "clear"; ids = LIST1 IDENT ->
213 GrafiteAst.Clear (loc, ids)
214 | IDENT "clearbody"; id = IDENT ->
215 GrafiteAst.ClearBody (loc,id)
216 | IDENT "change"; what = pattern_spec; "with"; t = tactic_term ->
217 GrafiteAst.Change (loc, what, t)
218 | IDENT "compose"; times = OPT int; t1 = tactic_term; t2 =
219 OPT [ "with"; t = tactic_term -> t ]; specs = intros_spec ->
220 let times = match times with None -> 1 | Some i -> i in
221 GrafiteAst.Compose (loc, t1, t2, times, specs)
222 | IDENT "constructor"; n = int ->
223 GrafiteAst.Constructor (loc, n)
224 | IDENT "contradiction" ->
225 GrafiteAst.Contradiction loc
226 | IDENT "cut"; t = tactic_term; ident = OPT [ "as"; id = IDENT -> id] ->
227 GrafiteAst.Cut (loc, ident, t)
228 | IDENT "decompose"; idents = OPT [ "as"; idents = LIST1 new_name -> idents ] ->
229 let idents = match idents with None -> [] | Some idents -> idents in
230 GrafiteAst.Decompose (loc, idents)
231 | IDENT "demodulate"; p = auto_params -> GrafiteAst.Demodulate (loc, p)
232 | IDENT "destruct"; xts = OPT [ ts = tactic_term_list1 -> ts ] ->
233 GrafiteAst.Destruct (loc, xts)
234 | IDENT "elim"; what = tactic_term; using = using;
235 pattern = OPT pattern_spec;
236 ispecs = intros_spec ->
237 let pattern = match pattern with
238 | None -> None, [], Some Ast.UserInput
239 | Some pattern -> pattern
241 GrafiteAst.Elim (loc, what, using, pattern, ispecs)
242 | IDENT "elimType"; what = tactic_term; using = using;
243 (num, idents) = intros_spec ->
244 GrafiteAst.ElimType (loc, what, using, (num, idents))
245 | IDENT "exact"; t = tactic_term ->
246 GrafiteAst.Exact (loc, t)
248 GrafiteAst.Exists loc
249 | IDENT "fail" -> GrafiteAst.Fail loc
250 | IDENT "fold"; kind = reduction_kind; t = tactic_term; p = pattern_spec ->
253 raise (HExtlib.Localized (loc, CicNotationParser.Parse_error
254 ("the pattern cannot specify the term to replace, only its"
255 ^ " paths in the hypotheses and in the conclusion")))
257 GrafiteAst.Fold (loc, kind, t, p)
259 GrafiteAst.Fourier loc
260 | IDENT "fwd"; hyp = IDENT; idents = OPT [ "as"; idents = LIST1 new_name -> idents ] ->
261 let idents = match idents with None -> [] | Some idents -> idents in
262 GrafiteAst.FwdSimpl (loc, hyp, idents)
263 | IDENT "generalize"; p=pattern_spec; id = OPT ["as" ; id = IDENT -> id] ->
264 GrafiteAst.Generalize (loc,p,id)
265 | IDENT "id" -> GrafiteAst.IdTac loc
266 | IDENT "intro"; ident = OPT IDENT ->
267 let idents = match ident with None -> [] | Some id -> [Some id] in
268 GrafiteAst.Intros (loc, (Some 1, idents))
269 | IDENT "intros"; specs = intros_spec ->
270 GrafiteAst.Intros (loc, specs)
271 | IDENT "inversion"; t = tactic_term ->
272 GrafiteAst.Inversion (loc, t)
274 linear = OPT [ IDENT "linear" ];
275 depth = OPT [ IDENT "depth"; SYMBOL "="; i = int -> i ];
277 to_what = OPT [ "to" ; t = tactic_term_list1 -> t ];
278 ident = OPT [ "as" ; ident = IDENT -> ident ] ->
279 let linear = match linear with None -> false | Some _ -> true in
280 let to_what = match to_what with None -> [] | Some to_what -> to_what in
281 GrafiteAst.LApply (loc, linear, depth, to_what, what, ident)
282 | IDENT "left" -> GrafiteAst.Left loc
283 | IDENT "letin"; where = IDENT ; SYMBOL <:unicode<def>> ; t = tactic_term ->
284 GrafiteAst.LetIn (loc, t, where)
285 | kind = reduction_kind; p = pattern_spec ->
286 GrafiteAst.Reduce (loc, kind, p)
287 | IDENT "reflexivity" ->
288 GrafiteAst.Reflexivity loc
289 | IDENT "replace"; p = pattern_spec; "with"; t = tactic_term ->
290 GrafiteAst.Replace (loc, p, t)
291 | IDENT "rewrite" ; d = direction; t = tactic_term ; p = pattern_spec;
292 xnames = OPT [ "as"; n = ident_list0 -> n ] ->
296 (HExtlib.Localized (loc,
297 (CicNotationParser.Parse_error
298 "the pattern cannot specify the term to rewrite, only its paths in the hypotheses and in the conclusion")))
300 let n = match xnames with None -> [] | Some names -> names in
301 GrafiteAst.Rewrite (loc, d, t, p, n)
308 | IDENT "symmetry" ->
309 GrafiteAst.Symmetry loc
310 | IDENT "transitivity"; t = tactic_term ->
311 GrafiteAst.Transitivity (loc, t)
312 (* Produzioni Aggiunte *)
313 | IDENT "assume" ; id = IDENT ; SYMBOL ":" ; t = tactic_term ->
314 GrafiteAst.Assume (loc, id, t)
315 | IDENT "suppose" ; t = tactic_term ; LPAREN ; id = IDENT ; RPAREN ;
316 t1 = OPT [IDENT "that" ; IDENT "is" ; IDENT "equivalent" ; "to" ;
317 t' = tactic_term -> t']->
318 GrafiteAst.Suppose (loc, t, id, t1)
319 | "let" ; id1 = IDENT ; SYMBOL ":" ; t1 = tactic_term ;
320 IDENT "such" ; IDENT "that" ; t2=tactic_term ; LPAREN ;
321 id2 = IDENT ; RPAREN ->
322 GrafiteAst.ExistsElim (loc, `Auto ([],[]), id1, t1, id2, t2)
324 [ IDENT "using"; t=tactic_term -> `Term t
325 | params = auto_params -> `Auto params] ;
326 cont=by_continuation ->
328 BYC_done -> GrafiteAst.Bydone (loc, just)
329 | BYC_weproved (ty,id,t1) ->
330 GrafiteAst.By_just_we_proved(loc, just, ty, id, t1)
331 | BYC_letsuchthat (id1,t1,id2,t2) ->
332 GrafiteAst.ExistsElim (loc, just, id1, t1, id2, t2)
333 | BYC_wehaveand (id1,t1,id2,t2) ->
334 GrafiteAst.AndElim (loc, just, id1, t1, id2, t2))
335 | IDENT "we" ; IDENT "need" ; "to" ; IDENT "prove" ; t = tactic_term ; id = OPT [ LPAREN ; id = IDENT ; RPAREN -> id ] ; t1 = OPT [IDENT "or" ; IDENT "equivalently"; t' = tactic_term -> t']->
336 GrafiteAst.We_need_to_prove (loc, t, id, t1)
337 | IDENT "we" ; IDENT "proceed" ; IDENT "by" ; IDENT "cases" ; "on" ; t=tactic_term ; "to" ; IDENT "prove" ; t1=tactic_term ->
338 GrafiteAst.We_proceed_by_cases_on (loc, t, t1)
339 | IDENT "we" ; IDENT "proceed" ; IDENT "by" ; IDENT "induction" ; "on" ; t=tactic_term ; "to" ; IDENT "prove" ; t1=tactic_term ->
340 GrafiteAst.We_proceed_by_induction_on (loc, t, t1)
341 | IDENT "by" ; IDENT "induction" ; IDENT "hypothesis" ; IDENT "we" ; IDENT "know" ; t=tactic_term ; LPAREN ; id = IDENT ; RPAREN ->
342 GrafiteAst.Byinduction(loc, t, id)
343 | IDENT "the" ; IDENT "thesis" ; IDENT "becomes" ; t=tactic_term ->
344 GrafiteAst.Thesisbecomes(loc, t)
345 | IDENT "case" ; id = IDENT ; params=LIST0[LPAREN ; i=IDENT ;
346 SYMBOL":" ; t=tactic_term ; RPAREN -> i,t] ->
347 GrafiteAst.Case(loc,id,params)
348 (* DO NOT FACTORIZE with the two following, camlp5 sucks*)
350 termine = tactic_term;
354 [ IDENT "using"; t=tactic_term -> `Term t
355 | IDENT "using"; IDENT "once"; term=tactic_term -> `SolveWith term
356 | IDENT "proof" -> `Proof
357 | params = auto_params -> `Auto params];
358 cont = rewriting_step_continuation ->
359 GrafiteAst.RewritingStep(loc, Some (None,termine), t1, t2, cont)
360 | IDENT "obtain" ; name = IDENT;
361 termine = tactic_term;
365 [ IDENT "using"; t=tactic_term -> `Term t
366 | IDENT "using"; IDENT "once"; term=tactic_term -> `SolveWith term
367 | IDENT "proof" -> `Proof
368 | params = auto_params -> `Auto params];
369 cont = rewriting_step_continuation ->
370 GrafiteAst.RewritingStep(loc, Some (Some name,termine), t1, t2, cont)
374 [ IDENT "using"; t=tactic_term -> `Term t
375 | IDENT "using"; IDENT "once"; term=tactic_term -> `SolveWith term
376 | IDENT "proof" -> `Proof
377 | params = auto_params -> `Auto params];
378 cont = rewriting_step_continuation ->
379 GrafiteAst.RewritingStep(loc, None, t1, t2, cont)
383 [ IDENT "paramodulation"
395 i = auto_fixed_param -> i,""
396 | i = auto_fixed_param ; SYMBOL "="; v = [ v = int ->
397 string_of_int v | v = IDENT -> v ] -> i,v ];
398 tl = OPT [ IDENT "by"; tl = tactic_term_list1 -> tl] ->
399 (match tl with Some l -> l | None -> []),
404 [ WEPROVED; ty = tactic_term ; LPAREN ; id = IDENT ; RPAREN ; t1 = OPT [IDENT "that" ; IDENT "is" ; IDENT "equivalent" ; "to" ; t2 = tactic_term -> t2] -> BYC_weproved (ty,Some id,t1)
405 | WEPROVED; ty = tactic_term ; t1 = OPT [IDENT "that" ; IDENT "is" ; IDENT "equivalent" ; "to" ; t2 = tactic_term -> t2] ;
406 "done" -> BYC_weproved (ty,None,t1)
408 | "let" ; id1 = IDENT ; SYMBOL ":" ; t1 = tactic_term ;
409 IDENT "such" ; IDENT "that" ; t2=tactic_term ; LPAREN ;
410 id2 = IDENT ; RPAREN -> BYC_letsuchthat (id1,t1,id2,t2)
411 | WEHAVE; t1=tactic_term ; LPAREN ; id1=IDENT ; RPAREN ;"and" ; t2=tactic_term ; LPAREN ; id2=IDENT ; RPAREN ->
412 BYC_wehaveand (id1,t1,id2,t2)
415 rewriting_step_continuation : [
422 [ t1 = SELF; SYMBOL ";"; t2 = SELF ->
425 | GrafiteAst.Seq (_, l) -> l @ [ t2 ]
428 GrafiteAst.Seq (loc, ts)
431 [ tac = SELF; SYMBOL ";";
432 SYMBOL "["; tacs = LIST0 SELF SEP SYMBOL "|"; SYMBOL "]"->
433 (GrafiteAst.Then (loc, tac, tacs))
436 [ IDENT "do"; count = int; tac = SELF ->
437 GrafiteAst.Do (loc, count, tac)
438 | IDENT "repeat"; tac = SELF -> GrafiteAst.Repeat (loc, tac)
442 SYMBOL "["; tacs = LIST0 SELF SEP SYMBOL "|"; SYMBOL "]"->
443 GrafiteAst.First (loc, tacs)
444 | IDENT "try"; tac = SELF -> GrafiteAst.Try (loc, tac)
446 SYMBOL "["; tacs = LIST0 SELF SEP SYMBOL "|"; SYMBOL "]"->
447 GrafiteAst.Solve (loc, tacs)
448 | IDENT "progress"; tac = SELF -> GrafiteAst.Progress (loc, tac)
449 | LPAREN; tac = SELF; RPAREN -> tac
450 | tac = tactic -> tac
453 punctuation_tactical:
455 [ SYMBOL "[" -> GrafiteAst.Branch loc
456 | SYMBOL "|" -> GrafiteAst.Shift loc
457 | i = LIST1 int SEP SYMBOL ","; SYMBOL ":" -> GrafiteAst.Pos (loc, i)
458 | SYMBOL "*"; SYMBOL ":" -> GrafiteAst.Wildcard loc
459 | SYMBOL "]" -> GrafiteAst.Merge loc
460 | SYMBOL ";" -> GrafiteAst.Semicolon loc
461 | SYMBOL "." -> GrafiteAst.Dot loc
464 non_punctuation_tactical:
466 [ IDENT "focus"; goals = LIST1 int -> GrafiteAst.Focus (loc, goals)
467 | IDENT "unfocus" -> GrafiteAst.Unfocus loc
468 | IDENT "skip" -> GrafiteAst.Skip loc
472 [ [ IDENT "ntheorem" ] -> `Theorem
476 [ [ IDENT "definition" ] -> `Definition
477 | [ IDENT "fact" ] -> `Fact
478 | [ IDENT "lemma" ] -> `Lemma
479 | [ IDENT "remark" ] -> `Remark
480 | [ IDENT "theorem" ] -> `Theorem
484 [ attr = theorem_flavour -> attr
485 | [ IDENT "axiom" ] -> `Axiom
486 | [ IDENT "mutual" ] -> `MutualDefinition
491 params = LIST0 protected_binder_vars;
492 SYMBOL ":"; fst_typ = term; SYMBOL <:unicode<def>>; OPT SYMBOL "|";
493 fst_constructors = LIST0 constructor SEP SYMBOL "|";
496 name = IDENT; SYMBOL ":"; typ = term; SYMBOL <:unicode<def>>;
497 OPT SYMBOL "|"; constructors = LIST0 constructor SEP SYMBOL "|" ->
498 (name, true, typ, constructors) ] SEP "with" -> types
502 (fun (names, typ) acc ->
503 (List.map (fun name -> (name, typ)) names) @ acc)
506 let fst_ind_type = (fst_name, true, fst_typ, fst_constructors) in
507 let tl_ind_types = match tl with None -> [] | Some types -> types in
508 let ind_types = fst_ind_type :: tl_ind_types in
514 params = LIST0 protected_binder_vars;
515 SYMBOL ":"; typ = term; SYMBOL <:unicode<def>>; SYMBOL "{" ;
519 SYMBOL ":" -> false,0
520 | SYMBOL ":"; SYMBOL ">" -> true,0
521 | SYMBOL ":"; arity = int ; SYMBOL ">" -> true,arity
524 let b,n = coercion in
526 ] SEP SYMBOL ";"; SYMBOL "}" ->
529 (fun (names, typ) acc ->
530 (List.map (fun name -> (name, typ)) names) @ acc)
533 (params,name,typ,fields)
537 [ [ IDENT "check" ]; t = term ->
538 GrafiteAst.Check (loc, t)
539 | [ IDENT "eval" ]; kind = reduction_kind; "on"; t = tactic_term ->
540 GrafiteAst.Eval (loc, kind, t)
542 style = OPT [ IDENT "procedural"; depth = OPT int -> depth ];
543 suri = QSTRING; prefix = OPT QSTRING;
544 flavour = OPT [ "as"; attr = inline_flavour -> attr ] ->
545 let style = match style with
546 | None -> GrafiteAst.Declarative
547 | Some depth -> GrafiteAst.Procedural depth
549 let prefix = match prefix with None -> "" | Some prefix -> prefix in
550 GrafiteAst.Inline (loc,style,suri,prefix, flavour)
551 | [ IDENT "hint" ]; rew = OPT (IDENT "rewrite") ->
552 if rew = None then GrafiteAst.Hint (loc, false) else GrafiteAst.Hint (loc,true)
553 | IDENT "auto"; params = auto_params ->
554 GrafiteAst.AutoInteractive (loc,params)
555 | [ IDENT "whelp"; "match" ] ; t = term ->
556 GrafiteAst.WMatch (loc,t)
557 | [ IDENT "whelp"; IDENT "instance" ] ; t = term ->
558 GrafiteAst.WInstance (loc,t)
559 | [ IDENT "whelp"; IDENT "locate" ] ; id = QSTRING ->
560 GrafiteAst.WLocate (loc,id)
561 | [ IDENT "whelp"; IDENT "elim" ] ; t = term ->
562 GrafiteAst.WElim (loc, t)
563 | [ IDENT "whelp"; IDENT "hint" ] ; t = term ->
564 GrafiteAst.WHint (loc,t)
568 [ IDENT "id"; id = QSTRING; SYMBOL "="; uri = QSTRING ->
569 let alpha = "[a-zA-Z]" in
570 let num = "[0-9]+" in
571 let ident_cont = "\\("^alpha^"\\|"^num^"\\|_\\|\\\\\\)" in
572 let decoration = "\\'" in
573 let ident = "\\("^alpha^ident_cont^"*"^decoration^"*\\|_"^ident_cont^"+"^decoration^"*\\)" in
574 let rex = Str.regexp ("^"^ident^"$") in
575 if Str.string_match rex id 0 then
576 if (try ignore (UriManager.uri_of_string uri); true
577 with UriManager.IllFormedUri _ -> false)
579 LexiconAst.Ident_alias (id, uri)
582 (HExtlib.Localized (loc, CicNotationParser.Parse_error (Printf.sprintf "Not a valid uri: %s" uri)))
584 raise (HExtlib.Localized (loc, CicNotationParser.Parse_error (
585 Printf.sprintf "Not a valid identifier: %s" id)))
586 | IDENT "symbol"; symbol = QSTRING;
587 instance = OPT [ LPAREN; IDENT "instance"; n = int; RPAREN -> n ];
588 SYMBOL "="; dsc = QSTRING ->
590 match instance with Some i -> i | None -> 0
592 LexiconAst.Symbol_alias (symbol, instance, dsc)
594 instance = OPT [ LPAREN; IDENT "instance"; n = int; RPAREN -> n ];
595 SYMBOL "="; dsc = QSTRING ->
597 match instance with Some i -> i | None -> 0
599 LexiconAst.Number_alias (instance, dsc)
603 [ l = LIST0 [ SYMBOL <:unicode<eta>> (* η *); SYMBOL "." -> () ];
605 Ast.IdentArg (List.length l, id)
609 [ IDENT "left"; IDENT "associative" -> Gramext.LeftA
610 | IDENT "right"; IDENT "associative" -> Gramext.RightA
611 | IDENT "non"; IDENT "associative" -> Gramext.NonA
615 [ "with"; IDENT "precedence"; n = NUMBER -> int_of_string n ]
618 [ dir = OPT direction; s = QSTRING;
619 assoc = OPT associativity; prec = precedence;
622 [ blob = UNPARSED_AST ->
623 add_raw_attribute ~text:(Printf.sprintf "@{%s}" blob)
624 (CicNotationParser.parse_level2_ast
625 (Ulexing.from_utf8_string blob))
626 | blob = UNPARSED_META ->
627 add_raw_attribute ~text:(Printf.sprintf "${%s}" blob)
628 (CicNotationParser.parse_level2_meta
629 (Ulexing.from_utf8_string blob))
633 | None -> default_associativity
634 | Some assoc -> assoc
637 add_raw_attribute ~text:s
638 (CicNotationParser.parse_level1_pattern prec
639 (Ulexing.from_utf8_string s))
641 (dir, p1, assoc, prec, p2)
645 [ u = URI -> Ast.UriPattern (UriManager.uri_of_string u)
646 | id = IDENT -> Ast.VarPattern id
647 | SYMBOL "_" -> Ast.ImplicitPattern
648 | LPAREN; terms = LIST1 SELF; RPAREN ->
652 | terms -> Ast.ApplPattern terms)
656 [ s = CSYMBOL; args = LIST0 argument; SYMBOL "="; t = level3_term ->
662 IDENT "include" ; path = QSTRING ->
663 loc,path,LexiconAst.WithPreferences
664 | IDENT "include'" ; path = QSTRING ->
665 loc,path,LexiconAst.WithoutPreferences
669 IDENT "set"; n = QSTRING; v = QSTRING ->
670 GrafiteAst.Set (loc, n, v)
671 | IDENT "drop" -> GrafiteAst.Drop loc
672 | IDENT "print"; s = IDENT -> GrafiteAst.Print (loc,s)
673 | IDENT "qed" -> GrafiteAst.Qed loc
674 | IDENT "variant" ; name = IDENT; SYMBOL ":";
675 typ = term; SYMBOL <:unicode<def>> ; newname = IDENT ->
678 (`Variant,name,typ,Some (Ast.Ident (newname, None))))
679 | nflavour = ntheorem_flavour; name = IDENT; SYMBOL ":"; typ = term;
680 body = OPT [ SYMBOL <:unicode<def>> (* ≝ *); body = term -> body ] ->
681 GrafiteAst.NObj (loc, Ast.Theorem (nflavour, name, typ, body))
682 | flavour = theorem_flavour; name = IDENT; SYMBOL ":"; typ = term;
683 body = OPT [ SYMBOL <:unicode<def>> (* ≝ *); body = term -> body ] ->
684 GrafiteAst.Obj (loc, Ast.Theorem (flavour, name, typ, body))
685 | flavour = theorem_flavour; name = IDENT; SYMBOL <:unicode<def>> (* ≝ *);
688 Ast.Theorem (flavour, name, Ast.Implicit, Some body))
689 | IDENT "axiom"; name = IDENT; SYMBOL ":"; typ = term ->
690 GrafiteAst.Obj (loc, Ast.Theorem (`Axiom, name, typ, None))
691 | LETCOREC ; defs = let_defs ->
692 mk_rec_corec `CoInductive defs loc
693 | LETREC ; defs = let_defs ->
694 mk_rec_corec `Inductive defs loc
695 | IDENT "inductive"; spec = inductive_spec ->
696 let (params, ind_types) = spec in
697 GrafiteAst.Obj (loc, Ast.Inductive (params, ind_types))
698 | IDENT "coinductive"; spec = inductive_spec ->
699 let (params, ind_types) = spec in
700 let ind_types = (* set inductive flags to false (coinductive) *)
701 List.map (fun (name, _, term, ctors) -> (name, false, term, ctors))
704 GrafiteAst.Obj (loc, Ast.Inductive (params, ind_types))
706 t = [ u = URI -> Ast.Uri (u,None) | t = tactic_term ; OPT "with" -> t ] ;
707 arity = OPT int ; saturations = OPT int;
708 composites = OPT (IDENT "nocomposites") ->
709 let arity = match arity with None -> 0 | Some x -> x in
710 let saturations = match saturations with None -> 0 | Some x -> x in
711 let composites = match composites with None -> true | Some _ -> false in
713 (loc, t, composites, arity, saturations)
714 | IDENT "prefer" ; IDENT "coercion"; t = tactic_term ->
715 GrafiteAst.PreferCoercion (loc, t)
716 | IDENT "unification"; IDENT "hint"; n = int; t = tactic_term ->
717 GrafiteAst.UnificationHint (loc, t, n)
718 | IDENT "record" ; (params,name,ty,fields) = record_spec ->
719 GrafiteAst.Obj (loc, Ast.Record (params,name,ty,fields))
720 | IDENT "default" ; what = QSTRING ; uris = LIST1 URI ->
721 let uris = List.map UriManager.uri_of_string uris in
722 GrafiteAst.Default (loc,what,uris)
723 | IDENT "relation" ; aeq = tactic_term ; "on" ; a = tactic_term ;
724 refl = OPT [ IDENT "reflexivity" ; IDENT "proved" ; IDENT "by" ;
725 refl = tactic_term -> refl ] ;
726 sym = OPT [ IDENT "symmetry" ; IDENT "proved" ; IDENT "by" ;
727 sym = tactic_term -> sym ] ;
728 trans = OPT [ IDENT "transitivity" ; IDENT "proved" ; IDENT "by" ;
729 trans = tactic_term -> trans ] ;
731 GrafiteAst.Relation (loc,id,a,aeq,refl,sym,trans)
734 IDENT "alias" ; spec = alias_spec ->
735 LexiconAst.Alias (loc, spec)
736 | IDENT "notation"; (dir, l1, assoc, prec, l2) = notation ->
737 LexiconAst.Notation (loc, dir, l1, assoc, prec, l2)
738 | IDENT "interpretation"; id = QSTRING;
739 (symbol, args, l3) = interpretation ->
740 LexiconAst.Interpretation (loc, id, (symbol, args), l3)
743 [ cmd = grafite_command; SYMBOL "." -> GrafiteAst.Command (loc, cmd)
744 | tac = atomic_tactical LEVEL "loops"; punct = punctuation_tactical ->
745 GrafiteAst.Tactic (loc, Some tac, punct)
746 | punct = punctuation_tactical -> GrafiteAst.Tactic (loc, None, punct)
747 | tac = ntactic; punct = punctuation_tactical ->
748 GrafiteAst.NTactic (loc, tac, punct)
749 | tac = non_punctuation_tactical; punct = punctuation_tactical ->
750 GrafiteAst.NonPunctuationTactical (loc, tac, punct)
751 | mac = macro; SYMBOL "." -> GrafiteAst.Macro (loc, mac)
755 [ BEGINCOMMENT ; ex = executable ; ENDCOMMENT ->
756 GrafiteAst.Code (loc, ex)
758 GrafiteAst.Note (loc, str)
763 fun ?(never_include=false) ~include_paths status -> status,LSome(GrafiteAst.Executable (loc,ex))
765 fun ?(never_include=false) ~include_paths status ->
766 status,LSome (GrafiteAst.Comment (loc, com))
767 | (iloc,fname,mode) = include_command ; SYMBOL "." ->
769 fun ?(never_include=false) ~include_paths status ->
770 let _root, buri, fullpath, _rrelpath =
771 Librarian.baseuri_of_script ~include_paths fname
774 if never_include then raise (NoInclusionPerformed fullpath)
775 else LexiconEngine.eval_command status
776 (LexiconAst.Include (iloc,buri,mode,fullpath))
780 (GrafiteAst.Executable
781 (loc,GrafiteAst.Command
782 (loc,GrafiteAst.Include (iloc,buri))))
783 | scom = lexicon_command ; SYMBOL "." ->
784 fun ?(never_include=false) ~include_paths status ->
785 let status = LexiconEngine.eval_command status scom in
787 | EOI -> raise End_of_file
794 let _ = initialize_parser () ;;
796 let exc_located_wrapper f =
800 | Stdpp.Exc_located (_, End_of_file) -> raise End_of_file
801 | Stdpp.Exc_located (floc, Stream.Error msg) ->
802 raise (HExtlib.Localized (floc,CicNotationParser.Parse_error msg))
803 | Stdpp.Exc_located (floc, HExtlib.Localized(_,exn)) ->
805 (HExtlib.Localized (floc,CicNotationParser.Parse_error (Printexc.to_string exn)))
806 | Stdpp.Exc_located (floc, exn) ->
808 (HExtlib.Localized (floc,CicNotationParser.Parse_error (Printexc.to_string exn)))
810 let parse_statement lexbuf =
812 (fun () -> (Grammar.Entry.parse !grafite_parser.statement (Obj.magic lexbuf)))
814 let statement () = !grafite_parser.statement
816 let history = ref [] ;;
820 history := !grafite_parser :: !history;
821 grafite_parser := initial_parser ();
830 grafite_parser := gp;
834 (* vim:set foldmethod=marker: *)