]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/ocaml/cic_disambiguation/parser.ml
- removed some unneeded dependencies from debian/control
[helm.git] / helm / ocaml / cic_disambiguation / parser.ml
index 0ee41ab2afe0fc5f0a28afe25937044c0c0fd1c8..1621b3ccc254b8225e547e4a070a650d2a1fca2c 100644 (file)
@@ -1,5 +1,35 @@
+(* Copyright (C) 2004, HELM Team.
+ * 
+ * This file is part of HELM, an Hypertextual, Electronic
+ * Library of Mathematics, developed at the Computer Science
+ * Department, University of Bologna, Italy.
+ * 
+ * HELM is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * HELM is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HELM; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA  02111-1307, USA.
+ * 
+ * For details, see the HELM World-Wide-Web page,
+ * http://helm.cs.unibo.it/
+ *)
 
-open Ast
+let debug = true
+let debug_print s =
+  if debug then begin
+    prerr_endline "<NEW_TEXTUAL_PARSER>";
+    prerr_endline s;
+    prerr_endline "</NEW_TEXTUAL_PARSER>"
+  end
 
 let grammar = Grammar.gcreate Lexer.lex
 
@@ -7,7 +37,11 @@ let term = Grammar.Entry.create grammar "term"
 (* let tactic = Grammar.Entry.create grammar "tactic" *)
 (* let tactical = Grammar.Entry.create grammar "tactical" *)
 
-let return_term loc term = LocatedTerm (loc, term)
+let return_term loc term = Ast.LocatedTerm (loc, term)
+(* let return_term loc term = term *)
+
+let fail (x, y) msg =
+  failwith (Printf.sprintf "Error at characters %d - %d: %s" x y msg)
 
 EXTEND
   GLOBAL: term;
@@ -34,8 +68,8 @@ EXTEND
           substs
       ] ->
         (match subst with
-        | Some l -> Ident (s, l)
-        | None -> Ident (s, []))
+        | Some l -> Ast.Ident (s, l)
+        | None -> Ast.Ident (s, []))
     ]
   ];
   name: [ (* as substituted_name with no explicit substitution *)
@@ -46,35 +80,57 @@ EXTEND
     | LPAREN "("; names = LIST1 name; RPAREN ")" -> names ]
   ];
   term:
-    [ "add" LEFTA   [ (* nothing here by default *) ]
-    | "mult" LEFTA  [ (* nothing here by default *) ]
-    | "inv" NONA    [ (* nothing here by default *) ]
+    [ "arrow" RIGHTA
+      [ t1 = term; SYMBOL <:unicode<to>>; t2 = term ->
+          return_term loc (Ast.Binder (`Pi, Cic.Anonymous, Some t1, t2))
+      ]
+    | "eq" LEFTA
+      [ t1 = term; SYMBOL "="; t2 = term ->
+        return_term loc (Ast.Appl_symbol ("eq", 0, [t1; t2]))
+      ]
+    | "add" LEFTA     [ (* nothing here by default *) ]
+    | "mult" LEFTA    [ (* nothing here by default *) ]
+    | "inv" NONA      [ (* nothing here by default *) ]
     | "simple" NONA
       [
+        (* TODO handle "_" *)
         b = binder; vars = LIST1 IDENT SEP SYMBOL ",";
         typ = OPT [ SYMBOL ":"; t = term -> t ];
         SYMBOL "."; body = term ->
           let binder =
-            List.fold_right (fun var body -> Binder (b, var, typ, body))
+            List.fold_right
+              (fun var body -> Ast.Binder (b, Cic.Name var, typ, body))
               vars body
           in
           return_term loc binder
+      | sort_kind = [
+          "Prop" -> `Prop | "Set" -> `Set | "Type" -> `Type | "CProp" -> `CProp
+        ] ->
+          Ast.Sort sort_kind
       | n = substituted_name -> return_term loc n
       | LPAREN "("; head = term; args = LIST1 term; RPAREN ")" ->
-          return_term loc (Appl (head :: args))
-      | i = INT -> return_term loc (Int (int_of_string i))
+          return_term loc (Ast.Appl (head :: args))
+      | i = NUM -> return_term loc (Ast.Num (i, 0))
+(*       | i = NUM -> return_term loc (Ast.Num (i, Random.int max_int)) *)
       | m = META;
         substs = [
           LPAREN "["; substs = LIST0 meta_subst SEP SYMBOL ";" ; RPAREN "]" ->
             substs
         ] ->
-            return_term loc (Meta (m, substs))
+            let index =
+              try
+                int_of_string (String.sub m 1 (String.length m - 1))
+              with Failure "int_of_string" ->
+                fail loc ("Invalid meta variable number: " ^ m)
+            in
+            return_term loc (Ast.Meta (index, substs))
         (* actually "in" and "and" are _not_ keywords. Parsing works anyway
          * since applications are required to be bound by parens *)
       | "let"; name = IDENT; SYMBOL <:unicode<def>> (* ≝ *); t1 = term;
         IDENT "in"; t2 = term ->
-          return_term loc (LetIn (name, t1, t2))
-      | "let"; "rec"; defs = LIST1 [
+          return_term loc (Ast.LetIn (name, t1, t2))
+      | "let"; ind_kind = [ "corec" -> `CoInductive | "rec"-> `Inductive ];
+          defs = LIST1 [
           name = IDENT;
           index = OPT [ LPAREN "("; index = INT; RPAREN ")" ->
             int_of_string index
@@ -84,15 +140,17 @@ EXTEND
             (name, t1, typ, (match index with None -> 1 | Some i -> i))
         ] SEP (IDENT "and");
         IDENT "in"; body = term ->
-          return_term loc (LetRec (defs, body))
-      | typ = OPT [ LPAREN "["; typ = term; RPAREN "]" -> typ ];
-        "match"; t = term; "with";
+          return_term loc (Ast.LetRec (ind_kind, defs, body))
+      | outtyp = OPT [ LPAREN "["; typ = term; RPAREN "]" -> typ ];
+        "match"; t = term;
+        SYMBOL ":"; indty = IDENT;
+        "with";
         LPAREN "[";
         patterns = LIST0 [
-          p = pattern; SYMBOL <:unicode<Rightarrow>> (* ⇒*); t = term -> (p, t)
+          p = pattern; SYMBOL <:unicode<Rightarrow>> (* ⇒ *); t = term -> (p, t)
         ] SEP SYMBOL "|";
         RPAREN "]" ->
-          return_term loc (Case (t, typ, patterns))
+          return_term loc (Ast.Case (t, indty, outtyp, patterns))
       | LPAREN "("; t = term; RPAREN ")" -> return_term loc t
       ]
     ];