diff options
Diffstat (limited to 'parsing/g_ltacnew.ml4')
-rw-r--r-- | parsing/g_ltacnew.ml4 | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/parsing/g_ltacnew.ml4 b/parsing/g_ltacnew.ml4 new file mode 100644 index 000000000..fe7c17ad1 --- /dev/null +++ b/parsing/g_ltacnew.ml4 @@ -0,0 +1,209 @@ +(***********************************************************************) +(* v * The Coq Proof Assistant / The Coq Development Team *) +(* <O___,, * INRIA-Rocquencourt & LRI-CNRS-Orsay *) +(* \VV/ *************************************************************) +(* // * This file is distributed under the terms of the *) +(* * GNU Lesser General Public License Version 2.1 *) +(***********************************************************************) + +(* $Id$ *) + +open Pp +open Util +open Ast +open Topconstr +open Rawterm +open Tacexpr +open Vernacexpr +open Ast + +ifdef Quotify then +open Qast +else +open Pcoq + +open Prim +open Tactic + +ifdef Quotify then +open Q + +type let_clause_kind = + | LETTOPCLAUSE of Names.identifier * constr_expr + | LETCLAUSE of + (Names.identifier Util.located * constr_expr may_eval option * raw_tactic_arg) + +ifdef Quotify then +module Prelude = struct +let fail_default_value = Qast.Int "0" + +let out_letin_clause loc = function + | Qast.Node ("LETTOPCLAUSE", _) -> user_err_loc (loc, "", (str "Syntax Error")) + | Qast.Node ("LETCLAUSE", [id;c;d]) -> + Qast.Tuple [id;c;d] + | _ -> anomaly "out_letin_clause" + +let make_letin_clause _ = function + | Qast.List l -> Qast.List (List.map (out_letin_clause dummy_loc) l) + | _ -> anomaly "make_letin_clause" +end +else +module Prelude = struct +let fail_default_value = 0 + +let out_letin_clause loc = function + | LETTOPCLAUSE _ -> user_err_loc (loc, "", (str "Syntax Error")) + | LETCLAUSE (id,c,d) -> (id,c,d) + +let make_letin_clause loc = List.map (out_letin_clause loc) +end + +let arg_of_expr = function + TacArg a -> a + | e -> Tacexp e + +open Prelude + +(* Tactics grammar rules *) + +let tactic_expr = Gram.Entry.create "tactic:tactic_expr" + +GEXTEND Gram + GLOBAL: tactic Vernac_.command tactic_expr tactic_arg; + + tactic_expr: + [ "5" LEFTA + [ ta0 = tactic_expr; "&"; ta1 = tactic_expr -> TacThen (ta0, ta1) + | ta = tactic_expr; "&"; "["; lta = LIST0 tactic_expr SEP "|"; "]" -> + TacThens (ta, lta) ] + | "4" + [ ] + | "3" RIGHTA + [ IDENT "try"; ta = tactic_expr -> TacTry ta + | IDENT "do"; n = natural; ta = tactic_expr -> TacDo (n,ta) + | IDENT "repeat"; ta = tactic_expr -> TacRepeat ta + | IDENT "progress"; ta = tactic_expr -> TacProgress ta + | IDENT "info"; tc = tactic_expr -> TacInfo tc ] + | "2" RIGHTA + [ ta0 = tactic_expr; "||"; ta1 = tactic_expr -> TacOrelse (ta0,ta1) ] + | "1" RIGHTA + [ "fun"; it = LIST1 input_fun ; "=>"; body = tactic_expr -> + TacFun (it,body) + | IDENT "rec"; rcl = LIST1 rec_clause SEP "with"; "in"; + body = tactic_expr -> TacLetRecIn (rcl,body) + | "let"; llc = LIST1 let_clause SEP "with"; "in"; + u = tactic_expr -> TacLetIn (make_letin_clause loc llc,u) + | "match"; IDENT "context"; "with"; mrl = match_context_list; "end" -> + TacMatchContext (false,mrl) + | "match"; IDENT "reverse"; IDENT "context"; "with"; + mrl = match_context_list; "end" -> + TacMatchContext (true,mrl) + | "match"; c = constrarg; "with"; mrl = match_list; "end" -> + TacMatch (c,mrl) +(*To do: put Abstract in Refiner*) + | IDENT "abstract"; tc = tactic_expr -> TacAbstract (tc,None) + | IDENT "abstract"; tc = tactic_expr; "using"; s = base_ident -> + TacAbstract (tc,Some s) +(*End of To do*) + | IDENT "first" ; "["; l = LIST0 tactic_expr SEP "|"; "]" -> + TacFirst l + | IDENT "solve" ; "["; l = LIST0 tactic_expr SEP "|"; "]" -> + TacSolve l + | IDENT "idtac" -> TacId + | IDENT "fail" -> TacFail fail_default_value + | IDENT "fail"; n = natural -> TacFail n + | st = simple_tactic -> TacAtom (loc,st) + | IDENT "eval"; rtc = red_expr; "in"; c = Constr.lconstr -> + TacArg(ConstrMayEval (ConstrEval (rtc,c))) + | IDENT "inst"; id = identref; "["; c = Constr.lconstr; "]" -> + TacArg(ConstrMayEval (ConstrContext (id,c))) + | IDENT "check"; c = Constr.lconstr -> + TacArg(ConstrMayEval (ConstrTypeOf c)) + | "'"; c = Constr.constr -> TacArg(ConstrMayEval(ConstrTerm c)) + | r = reference; la = LIST1 tactic_arg -> + TacArg(TacCall (loc,r,la)) + | r = reference -> TacArg (Reference r) ] + | "0" + [ "("; a = tactic_expr; ")" -> a + | a = tactic_atom -> TacArg a ] ] + ; + (* Tactic arguments *) + tactic_arg: + [ [ "'"; a = tactic_expr LEVEL "0" -> arg_of_expr a + | a = tactic_atom -> a + | c = Constr.constr -> ConstrMayEval (ConstrTerm c) ] ] + ; + tactic_atom: + [ [ id = METAIDENT -> MetaIdArg (loc,id) + | r = reference -> Reference r + | "?"; n = natural -> MetaNumArg (loc,n) + | "()" -> TacVoid ] ] + ; + input_fun: + [ [ IDENT "_" -> None + | l = base_ident -> Some l ] ] + ; + let_clause: + [ [ id = identref; ":="; te = tactic_expr -> + LETCLAUSE (id, None, arg_of_expr te) + | (_,id) = identref; ":"; c = Constr.constr; ":="; IDENT "proof" -> + LETTOPCLAUSE (id, c) + | id = identref; ":"; c = constrarg; ":="; te = tactic_expr -> + LETCLAUSE (id, Some c, arg_of_expr te) + | (_,id) = identref; ":"; c = Constr.lconstr -> + LETTOPCLAUSE (id, c) ] ] + ; + rec_clause: + [ [ name = identref; it = LIST1 input_fun; "=>"; body = tactic_expr -> + (name,(it,body)) ] ] + ; + match_pattern: + [ [ id = Constr.constr_pattern; "["; pc = Constr.constr_pattern; "]" -> + let s = coerce_to_id id in Subterm (Some s, pc) + | "["; pc = Constr.constr_pattern; "]" -> Subterm (None,pc) + | pc = Constr.constr_pattern -> Term pc ] ] + ; + match_hyps: + [ [ id = identref; ":"; mp = match_pattern -> Hyp (id, mp) + | IDENT "_"; ":"; mp = match_pattern -> NoHypId mp ] ] + ; + match_context_rule: + [ [ "["; largs = LIST0 match_hyps SEP ","; "|-"; mp = match_pattern; "]"; + "=>"; te = tactic_expr -> Pat (largs, mp, te) + | IDENT "_"; "=>"; te = tactic_expr -> All te ] ] + ; + match_context_list: + [ [ mrl = LIST1 match_context_rule SEP "|" -> mrl + | "|"; mrl = LIST1 match_context_rule SEP "|" -> mrl ] ] + ; + match_rule: + [ [ "["; mp = match_pattern; "]"; "=>"; te = tactic_expr -> Pat ([],mp,te) + | IDENT "_"; "=>"; te = tactic_expr -> All te ] ] + ; + match_list: + [ [ mrl = LIST1 match_rule SEP "|" -> mrl + | "|"; mrl = LIST1 match_rule SEP "|" -> mrl ] ] + ; + + (* Definitions for tactics *) + deftok: + [ [ IDENT "Meta" + | IDENT "Tactic" ] ] + ; + tacdef_body: + [ [ name = identref; it=LIST1 input_fun; ":="; body = tactic_expr -> + (name, TacFun (it, body)) + | name = identref; ":="; body = tactic_expr -> + (name, body) ] ] + ; + tactic: + [ [ tac = tactic_expr -> tac ] ] + ; + Vernac_.command: + [ [ deftok; IDENT "Definition"; b = tacdef_body -> + VernacDeclareTacticDefinition (false, [b]) + | IDENT "Recursive"; deftok; IDENT "Definition"; + l = LIST1 tacdef_body SEP "with" -> + VernacDeclareTacticDefinition (true, l) ] ] + ; + END |