From 6b649aba925b6f7462da07599fe67ebb12a3460e Mon Sep 17 00:00:00 2001 From: Samuel Mimram Date: Wed, 28 Jul 2004 21:54:47 +0000 Subject: Imported Upstream version 8.0pl1 --- parsing/g_prim.ml4 | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 parsing/g_prim.ml4 (limited to 'parsing/g_prim.ml4') diff --git a/parsing/g_prim.ml4 b/parsing/g_prim.ml4 new file mode 100644 index 00000000..ce6d4e2f --- /dev/null +++ b/parsing/g_prim.ml4 @@ -0,0 +1,138 @@ +(************************************************************************) +(* v * The Coq Proof Assistant / The Coq Development Team *) +(* 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] + +GEXTEND Gram + GLOBAL: ident natural integer bigint string preident ast + astlist qualid reference dirpath identref name base_ident var hyp; + + (* Compatibility: Prim.var is a synonym of Prim.ident *) + var: + [ [ id = ident -> id ] ] + ; + hyp: + [ [ id = ident -> id ] ] + ; + metaident: + [ [ s = METAIDENT -> Nmeta (loc,s) ] ] + ; + preident: + [ [ s = IDENT -> s ] ] + ; + base_ident: + [ [ s = IDENT -> local_id_of_string s ] ] + ; + name: + [ [ IDENT "_" -> (loc, Anonymous) + | id = base_ident -> (loc, Name id) ] ] + ; + identref: + [ [ id = base_ident -> (loc,id) ] ] + ; + ident: + [ [ id = base_ident -> id ] ] + ; + natural: + [ [ i = INT -> local_make_posint i ] ] + ; + bigint: + [ [ i = INT -> Bignat.POS (Bignat.of_string i) + | "-"; i = INT -> Bignat.NEG (Bignat.of_string i) ] ] + ; + integer: + [ [ i = INT -> local_make_posint i + | "-"; i = INT -> local_make_negint i ] ] + ; + field: + [ [ s = FIELD -> local_id_of_string s ] ] + ; + dirpath: + [ [ id = base_ident; l = LIST0 field -> + local_make_dirpath (local_append l id) ] ] + ; + fields: + [ [ id = field; (l,id') = fields -> (local_append l id,id') + | id = field -> ([],id) + ] ] + ; + basequalid: + [ [ id = base_ident; (l,id')=fields -> local_make_qualid (local_append l id) id' + | id = base_ident -> local_make_short_qualid id + ] ] + ; + qualid: + [ [ qid = basequalid -> loc, qid ] ] + ; + reference: + [ [ id = base_ident; (l,id') = fields -> + Qualid (loc, local_make_qualid (local_append l id) id') + | id = base_ident -> Ident (loc,id) + ] ] + ; + string: + [ [ s = STRING -> s ] ] + ; + astpath: + [ [ id = base_ident; (l,a) = fields -> + Path(loc, local_make_path (local_append l id) a) + | id = base_ident -> Nvar(loc, id) + ] ] + ; + (* ast *) + 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 + +(* + | "["; ido = astidoption; "]"; b = ast -> Slam(loc,ido,b) + | "["; id = METAIDENT; "]"; b = ast -> Smetalam(loc,id,b) +*) + | "'"; a = ast -> Node(loc,"$QUOTE",[a]) ] ] + ; + astlist: + [ [ l = LIST0 ast -> l ] ] + ; +END -- cgit v1.2.3