aboutsummaryrefslogtreecommitdiffhomepage
path: root/parsing/g_primnew.ml4
diff options
context:
space:
mode:
Diffstat (limited to 'parsing/g_primnew.ml4')
-rw-r--r--parsing/g_primnew.ml4143
1 files changed, 143 insertions, 0 deletions
diff --git a/parsing/g_primnew.ml4 b/parsing/g_primnew.ml4
new file mode 100644
index 000000000..de18ab764
--- /dev/null
+++ b/parsing/g_primnew.ml4
@@ -0,0 +1,143 @@
+(***********************************************************************)
+(* 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 *)
+(***********************************************************************)
+
+(*i $Id$ i*)
+
+open Coqast
+open Pcoq
+open Names
+open Libnames
+open Topconstr
+
+let _ = Pcoq.reset_all_grammars()
+let _ =
+ let f = Gram.Unsafe.clear_entry in
+ f Prim.bigint;
+ f Prim.qualid;
+ f Prim.ast;
+ f Prim.reference
+
+let prim_kw = ["{"; "}"; "["; "]"; "("; ")"; "<>"; "<<"; ">>"; "'";"."]
+let _ = List.iter (fun s -> Lexer.add_token("",s)) prim_kw
+
+ifdef Quotify then
+open Qast
+
+open Prim
+
+ifdef Quotify then
+module Prelude = struct
+let local_id_of_string s = Apply ("Names","id_of_string", [s])
+let local_make_dirpath l = Qast.Apply ("Names","make_dirpath",[l])
+let local_make_posint s = s
+let local_make_negint s = Apply ("Pervasives","~-", [s])
+let local_make_qualid l id' =
+ Qast.Apply ("Nametab","make_qualid", [local_make_dirpath l;id'])
+let local_make_short_qualid id =
+ Qast.Apply ("Nametab","make_short_qualid",[id])
+let local_make_path l id' =
+ Qast.Apply ("Libnames","encode_kn", [local_make_dirpath l;id'])
+let local_make_binding loc a b =
+ match a with
+ | Qast.Node ("Nvar", [_;id]) ->
+ Qast.Node ("Slam", [Qast.Loc; Qast.Option (Some id); b])
+ | Qast.Node ("Nmeta", [_;s]) ->
+ Qast.Node ("Smetalam", [Qast.Loc;s;b])
+ | _ ->
+ Qast.Apply ("Pervasives", "failwith", [Qast.Str "Slam expects a var or a metavar"])
+let local_append l id = Qast.Apply ("List","append", [l; Qast.List [id]])
+end
+
+else
+
+module Prelude = struct
+open Nametab
+let local_id_of_string = id_of_string
+let local_make_dirpath = make_dirpath
+let local_make_qualid l id' = make_qualid (local_make_dirpath l) id'
+let local_make_short_qualid id = make_short_qualid id
+let local_make_posint = int_of_string
+let local_make_negint n = - int_of_string n
+let local_make_path l a = encode_kn (local_make_dirpath l) a
+let local_make_binding loc a b =
+ match a with
+ | Nvar (_,id) -> Slam(loc,Some id,b)
+ | Nmeta (_,s) -> Smetalam(loc,s,b)
+ | _ -> failwith "Slam expects a var or a metavar"
+let local_append l id = l@[id]
+end
+
+open Prelude
+
+ifdef Quotify then
+open Q
+
+GEXTEND Gram
+ GLOBAL: ast bigint qualid reference;
+ metaident:
+ [ [ s = METAIDENT -> Nmeta (loc,s) ] ]
+ ;
+ field:
+ [ [ "."; s = IDENT -> local_id_of_string s ] ]
+ ;
+ fields:
+ [ [ id = field; (l,id') = fields -> (local_append l id,id')
+ | id = field -> ([],id)
+ ] ]
+ ;
+ astpath:
+ [ [ id = base_ident; (l,a) = fields ->
+ Path(loc, local_make_path (local_append l id) a)
+ | id = base_ident -> Nvar(loc, id)
+ ] ]
+ ;
+ basequalid:
+ [ [ id = base_ident; (l,id')=fields ->
+ local_make_qualid (local_append l id) id'
+ | id = base_ident -> local_make_short_qualid id
+ ] ]
+ ;
+ reference:
+ [ [ id = base_ident; (l,id') = fields ->
+ Qualid (loc, local_make_qualid (local_append l id) id')
+ | id = base_ident -> Ident (loc,id)
+ ] ]
+ ;
+ qualid:
+ [ [ qid = basequalid -> loc, qid ] ]
+ ;
+ ast:
+ [ [ id = metaident -> id
+ | p = astpath -> p
+ | s = INT -> Num(loc, local_make_posint s)
+ | s = STRING -> Str(loc, s)
+ | "{"; s = METAIDENT; "}" -> Id(loc,s)
+ | "("; nname = IDENT; l = LIST0 ast; ")" -> Node(loc,nname,l)
+ | "("; METAIDENT "$LIST"; id = metaident; ")" -> Node(loc,"$LIST",[id])
+ | "("; METAIDENT "$STR"; id = metaident; ")" -> Node(loc,"$STR",[id])
+ | "("; METAIDENT "$VAR"; id = metaident; ")" -> Node(loc,"$VAR",[id])
+ | "("; METAIDENT "$ID"; id = metaident; ")" -> Node(loc,"$ID",[id])
+ | "("; METAIDENT "$ABSTRACT"; l = LIST0 ast;")"->Node(loc,"$ABSTRACT",l)
+ | "("; METAIDENT "$PATH"; id = metaident; ")" -> Node(loc,"$PATH",[id])
+ | "("; METAIDENT "$NUM"; id = metaident; ")" -> Node(loc,"$NUM",[id])
+ | "["; "<>"; "]"; b = ast -> Slam(loc,None,b)
+ | "["; a = ast; "]"; b = ast -> local_make_binding loc a b
+ | "'"; a = ast -> Node(loc,"$QUOTE",[a]) ] ]
+ ;
+ bigint: (* Negative numbers are dealt with specially *)
+ [ [ i = INT -> Bignat.POS (Bignat.of_string i) ] ]
+ ;
+END
+
+let constr_to_ast a =
+ Termast.ast_of_rawconstr
+ (Constrintern.interp_rawconstr Evd.empty (Global.env()) a)
+
+let constr_parser_with_glob = Pcoq.map_entry constr_to_ast Constr.constr
+
+let _ = define_ast_quotation true "constr" constr_parser_with_glob