]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_disambiguation/cicTextualParser2.ml
on is now a keyword (needed in let rec)
[helm.git] / helm / ocaml / cic_disambiguation / cicTextualParser2.ml
index 728ff94a085157d37933e1d14e782f108c2866d6..25c15c575f9c763e33962106b2912456ed3554d1 100644 (file)
@@ -181,7 +181,7 @@ EXTEND
     [ defs = LIST1 [
         name = IDENT;
         args = LIST1 [arg = arg -> arg];
-        index_name = OPT [ IDENT "on"; idx = IDENT -> idx ];
+        index_name = OPT [ "on"; idx = IDENT -> idx ];
         ty = OPT [ SYMBOL ":" ; t = term -> t ];
         SYMBOL <:unicode<def>> (* ≝ *);
         t1 = term ->
@@ -327,31 +327,41 @@ EXTEND
     | [ IDENT "whd" ] -> `Whd 
     | [ IDENT "normalize" ] -> `Normalize ]
   ];
+  sequent_pattern_spec : [
+   [ hyp_paths =
+      LIST0
+       [ id = IDENT ;
+         path = OPT [SYMBOL ":" ; path = term -> path ] ->
+         (id,match path with Some p -> p | None -> CicAst.UserInput) ]
+       SEP SYMBOL ";";
+     goal_path = OPT [ SYMBOL <:unicode<vdash>>; term = term -> term ] ->
+      let goal_path =
+       match goal_path with
+          None -> CicAst.UserInput
+        | Some goal_path -> goal_path
+      in
+       hyp_paths,goal_path
+   ]
+  ];
   pattern_spec: [
-    [ wanted = OPT term;
-      hyp_paths_and_goal_path =
-       OPT [
-        "in";
-        hyp_paths =
-         LIST0
-          [ id = IDENT ;
-            path = OPT [SYMBOL ":" ; path = term -> path ] ->
-            (id,match path with Some p -> p | None -> CicAst.UserInput) ]
-          SEP SYMBOL ";";
-        goal_path = OPT [ SYMBOL <:unicode<vdash>>; term = term -> term ] ->
-         let goal_path =
-          match goal_path with
-             None -> CicAst.UserInput
-           | Some goal_path -> goal_path
-         in
-          hyp_paths,goal_path
-       ] ->
-         let hyp_paths,goal_path =
-          match hyp_paths_and_goal_path with
-             None -> [], CicAst.UserInput
-           | Some (hyp_paths,goal_path) -> hyp_paths,goal_path
+    [ res = OPT [
+       "in";
+       wanted_and_sps =
+        [ "match" ; wanted = term ;
+          sps = OPT [ "in"; sps = sequent_pattern_spec -> sps ] ->
+           Some wanted,sps
+        | sps = sequent_pattern_spec ->
+           None,Some sps
+        ] ->
+         let wanted,hyp_paths,goal_path =
+          match wanted_and_sps with
+             wanted,None -> wanted, [], CicAst.UserInput
+           | wanted,Some (hyp_paths,goal_path) -> wanted,hyp_paths,goal_path
          in
-          wanted, hyp_paths, goal_path ]
+          wanted, hyp_paths, goal_path ] ->
+      match res with
+         None -> None,[],CicAst.UserInput
+       | Some ps -> ps]
   ];
   direction: [
     [ SYMBOL ">" -> `LeftToRight
@@ -398,8 +408,14 @@ EXTEND
     | IDENT "exists" ->
         TacticAst.Exists loc
     | IDENT "fail" -> TacticAst.Fail loc
-    | IDENT "fold"; kind = reduction_kind; p = pattern_spec ->
-        TacticAst.Fold (loc, kind, p)
+    | IDENT "fold"; kind = reduction_kind; t = tactic_term; p = pattern_spec ->
+       let (pt,_,_) = p in
+        if pt <> None then
+         raise
+          (Parse_error
+            (loc,"the pattern cannot specify the term to replace, only its paths in the hypotheses and in the conclusion"))
+        else
+         TacticAst.Fold (loc, kind, t, p)
     | IDENT "fourier" ->
         TacticAst.Fourier loc
     | IDENT "fwd"; hyp = IDENT; idents = OPT ident_list0 ->