]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_disambiguation/cicTextualParser2.ml
moved away tactics and tacticals
[helm.git] / helm / ocaml / cic_disambiguation / cicTextualParser2.ml
index 2bcbb88e8da8a984c5b29c77a4620cd5be539652..349825bf99b53a33c0bd399a83fb88a890a51489 100644 (file)
@@ -43,11 +43,13 @@ let grammar = Grammar.gcreate CicTextualLexer2.cic_lexer
 
 let term = Grammar.Entry.create grammar "term"
 let term0 = Grammar.Entry.create grammar "term0"
-(* let tactic = Grammar.Entry.create grammar "tactic" *)
-(* let tactical = Grammar.Entry.create grammar "tactical" *)
+let tactic = Grammar.Entry.create grammar "tactic"
+let tactical = Grammar.Entry.create grammar "tactical"
+let tactical0 = Grammar.Entry.create grammar "tactical0"
 
 let return_term loc term = CicAst.AttributedTerm (`Loc loc, term)
-(* let return_term loc term = term *)
+let return_tactic loc tactic = TacticAst.LocatedTactic (loc, tactic)
+let return_tactical loc tactical = TacticAst.LocatedTactical (loc, tactical)
 
 let fail (x, y) msg =
   failwith (Printf.sprintf "Error at characters %d - %d: %s" x y msg)
@@ -57,17 +59,32 @@ let name_of_string = function
   | s -> Cic.Name s
 
 EXTEND
-  GLOBAL: term term0;
+  GLOBAL: term term0 tactic tactical tactical0;
+  int: [
+    [ num = NUM ->
+        try
+          int_of_string num
+        with Failure _ ->
+          let (x, y) = loc in
+          raise (Parse_error (sprintf
+            "integer literal expected at characters %d-%d" x y))
+    ]
+  ];
   meta_subst: [
     [ s = SYMBOL "_" -> None
     | t = term -> Some t ]
   ];
   binder: [
     [ SYMBOL <:unicode<lambda>> (* λ *) -> `Lambda
-    | SYMBOL <:unicode<pi>> (* π *) -> `Pi
+    | SYMBOL <:unicode<Pi>>     (* Π *) -> `Pi
     | SYMBOL <:unicode<exists>> (* ∃ *) -> `Exists
-    | SYMBOL <:unicode<forall>> (* ∀ *) -> `Forall
-    ]
+    | SYMBOL <:unicode<forall>> (* ∀ *) -> `Forall ]
+  ];
+  sort: [
+    [ "Prop" -> `Prop
+    | "Set" -> `Set
+    | "Type" -> `Type
+    | "CProp" -> `CProp ]
   ];
   typed_name: [
     [ PAREN "("; i = IDENT; SYMBOL ":"; typ = term; PAREN ")" ->
@@ -100,14 +117,9 @@ EXTEND
         (head, vars)
     ]
   ];
-  term0: [ [ t = term -> return_term loc t ] ];
+  term0: [ [ t = term; EOI -> return_term loc t ] ];
   term:
-    [ "arrow" RIGHTA
-      [ t1 = term; SYMBOL <:unicode<to>>; t2 = term ->
-          return_term loc
-            (CicAst.Binder (`Pi, (Cic.Anonymous, Some t1), t2))
-      ]
-    | "binder" RIGHTA
+    [ "binder" RIGHTA
       [
         b = binder;
         (vars, typ) =
@@ -125,6 +137,9 @@ EXTEND
               vars body
           in
           return_term loc binder
+      | t1 = term; SYMBOL <:unicode<to>> (* → *); t2 = term ->
+            return_term loc
+              (CicAst.Binder (`Pi, (Cic.Anonymous, Some t1), t2))
       ]
     | "eq" LEFTA
       [ t1 = term; SYMBOL "="; t2 = term ->
@@ -134,11 +149,7 @@ EXTEND
     | "mult" LEFTA    [ (* nothing here by default *) ]
     | "inv" NONA      [ (* nothing here by default *) ]
     | "simple" NONA
-      [
-        sort_kind = [
-          "Prop" -> `Prop | "Set" -> `Set | "Type" -> `Type | "CProp" -> `CProp
-        ] ->
-          CicAst.Sort sort_kind
+      [ sort = sort -> CicAst.Sort sort
       | n = substituted_name -> return_term loc n
       | PAREN "("; head = term; args = LIST1 term; PAREN ")" ->
           return_term loc (CicAst.Appl (head :: args))
@@ -179,7 +190,7 @@ EXTEND
             return_term loc (CicAst.LetRec (ind_kind, defs, body))
       | outtyp = OPT [ PAREN "["; typ = term; PAREN "]" -> typ ];
         "match"; t = term;
-        SYMBOL ":"; indty = IDENT;
+        indty_ident = OPT [ SYMBOL ":"; id = IDENT -> id ];
         "with";
         PAREN "[";
         patterns = LIST0 [
@@ -188,10 +199,96 @@ EXTEND
         ] SEP SYMBOL "|";
         PAREN "]" ->
           return_term loc
-            (CicAst.Case (t, indty, outtyp, patterns))
+            (CicAst.Case (t, indty_ident, outtyp, patterns))
       | PAREN "("; t = term; PAREN ")" -> return_term loc t
       ]
     ];
+  tactic_where: [
+    [ where = OPT [ "in"; ident = IDENT -> ident ] -> where ]
+  ];
+  tactic_term: [
+    [ t = term -> t ]
+  ];
+  ident_list0: [
+    [ PAREN "["; idents = LIST0 IDENT SEP SYMBOL ";"; PAREN "]" -> idents ]
+  ];
+  ident_list1: [
+    [ PAREN "["; idents = LIST1 IDENT SEP SYMBOL ";"; PAREN "]" -> idents ]
+  ];
+  reduction_kind: [
+    [ "reduce" -> `Reduce
+    | "simpl" -> `Simpl
+    | "whd" -> `Whd ]
+  ];
+  tactic: [
+    [ IDENT "absurd" -> return_tactic loc TacticAst.Absurd
+    | IDENT "apply"; t = tactic_term -> return_tactic loc (TacticAst.Apply t)
+    | IDENT "assumption" -> return_tactic loc TacticAst.Assumption
+    | IDENT "change"; t1 = tactic_term; "with"; t2 = tactic_term;
+      where = tactic_where ->
+        return_tactic loc (TacticAst.Change (t1, t2, where))
+    (* TODO Change_pattern *)
+    | IDENT "contradiction" -> return_tactic loc TacticAst.Contradiction
+    | IDENT "cut"; t = tactic_term -> return_tactic loc (TacticAst.Cut t)
+    | IDENT "decompose"; principles = ident_list1; where = IDENT ->
+        return_tactic loc (TacticAst.Decompose (where, principles))
+    | IDENT "discriminate"; hyp = IDENT ->
+        return_tactic loc (TacticAst.Discriminate hyp)
+    | IDENT "elim"; IDENT "type"; t = tactic_term ->
+        return_tactic loc (TacticAst.ElimType t)
+    | IDENT "elim"; t1 = tactic_term;
+      using = OPT [ IDENT "using"; using = tactic_term -> using ] ->
+        return_tactic loc (TacticAst.Elim (t1, using))
+    | IDENT "exact"; t = tactic_term -> return_tactic loc (TacticAst.Exact t)
+    | IDENT "exists" -> return_tactic loc TacticAst.Exists
+    | IDENT "fold"; kind = reduction_kind; t = tactic_term ->
+        return_tactic loc (TacticAst.Fold (kind, t))
+    | IDENT "fourier" -> return_tactic loc TacticAst.Fourier
+    | IDENT "injection"; ident = IDENT ->
+        return_tactic loc (TacticAst.Injection ident)
+    | IDENT "intros";
+      num = OPT [ num = int -> num ];
+      idents = OPT ident_list0 ->
+        let idents = match idents with None -> [] | Some idents -> idents in
+        return_tactic loc (TacticAst.Intros (num, idents))
+    | IDENT "left" -> return_tactic loc TacticAst.Left
+    | "let"; t = tactic_term; IDENT "in"; where = IDENT ->
+        return_tactic loc (TacticAst.LetIn (t, where))
+    (* TODO Reduce *)
+    | IDENT "reflexivity" -> return_tactic loc TacticAst.Reflexivity
+    | IDENT "replace"; t1 = tactic_term; "with"; t2 = tactic_term ->
+        return_tactic loc (TacticAst.Replace (t1, t2))
+    (* TODO Rewrite *)
+    (* TODO Replace_pattern *)
+    | IDENT "right" -> return_tactic loc TacticAst.Right
+    | IDENT "ring" -> return_tactic loc TacticAst.Ring
+    | IDENT "split" -> return_tactic loc TacticAst.Split
+    | IDENT "symmetry" -> return_tactic loc TacticAst.Symmetry
+    | IDENT "transitivity"; t = tactic_term ->
+        return_tactic loc (TacticAst.Transitivity t)
+    ]
+  ];
+  tactical0 : [ [ t = tactical; SYMBOL "." -> t ] ];
+  tactical: [
+    [ IDENT "fail" -> return_tactical loc TacticAst.Fail
+    | IDENT "do"; count = int; tac = tactical ->
+        return_tactical loc (TacticAst.Do (count, tac))
+    | IDENT "id" -> return_tactical loc TacticAst.IdTac
+    | IDENT "repeat"; tac = tactical ->
+        return_tactical loc (TacticAst.Repeat tac)
+    | tactics = LIST0 tactical SEP SYMBOL ";" ->
+        return_tactical loc (TacticAst.Seq tactics)
+    | tac = tactical;
+      PAREN "["; tacs = LIST0 tactical SEP SYMBOL ";"; PAREN "]" ->
+        return_tactical loc (TacticAst.Then (tac, tacs))
+    | IDENT "tries";
+      PAREN "["; tacs = LIST0 tactical SEP SYMBOL ";"; PAREN "]" ->
+        return_tactical loc (TacticAst.Tries tacs)
+    | IDENT "try"; tac = tactical -> return_tactical loc (TacticAst.Try tac)
+    | tac = tactic -> return_tactical loc (TacticAst.Tactic tac)
+    | PAREN "("; tac = tactical; PAREN ")" -> return_tactical loc tac
+    ]
+  ];
 END
 
 let parse_term stream =
@@ -201,6 +298,20 @@ let parse_term stream =
     raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
         (Printexc.to_string exn)))
 
+let parse_tactic stream =
+  try
+    Grammar.Entry.parse tactic stream
+  with Stdpp.Exc_located ((x, y), exn) ->
+    raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
+        (Printexc.to_string exn)))
+
+let parse_tactical stream =
+  try
+    Grammar.Entry.parse tactical0 stream
+  with Stdpp.Exc_located ((x, y), exn) ->
+    raise (Parse_error (sprintf "parse error at characters %d-%d: %s" x y
+        (Printexc.to_string exn)))
+
 (**/**)
 
 (** {2 Interface for gTopLevel} *)