X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=matita%2Fcomponents%2Fcontent_pres%2FcicNotationParser.ml;h=f3953eb08f3e5a24302c142d38c93b15ac8e98a1;hb=ac80c2cd2667de2942182ae0a98ad3dbadd7b559;hp=1f83a64d57d9b6ff0bc3e09f46d4156d4f0e4c3d;hpb=1caab3250f877ebff8fefc99dd7f5e7fd0596795;p=helm.git diff --git a/matita/components/content_pres/cicNotationParser.ml b/matita/components/content_pres/cicNotationParser.ml index 1f83a64d5..f3953eb08 100644 --- a/matita/components/content_pres/cicNotationParser.ml +++ b/matita/components/content_pres/cicNotationParser.ml @@ -36,11 +36,12 @@ exception Level_not_found of int let min_precedence = 0 let max_precedence = 100 -type ('a,'b,'c,'d) grammars = { +type ('a,'b,'c,'d,'e) grammars = { level1_pattern: 'a Grammar.Entry.e; level2_ast: 'b Grammar.Entry.e; level2_ast_grammar : Grammar.g; term: 'b Grammar.Entry.e; + ident: 'e Grammar.Entry.e; let_defs: 'c Grammar.Entry.e; protected_binder_vars: 'd Grammar.Entry.e; level2_meta: 'b Grammar.Entry.e; @@ -48,8 +49,11 @@ type ('a,'b,'c,'d) grammars = { type checked_l1_pattern = CL1P of NotationPt.term * int -let refresh_uri_in_checked_l1_pattern (CL1P (t,n)) = - CL1P (NotationUtil.refresh_uri_in_term t, n) +let refresh_uri_in_checked_l1_pattern ~refresh_uri_in_term + ~refresh_uri_in_reference (CL1P (t,n)) += + CL1P (NotationUtil.refresh_uri_in_term ~refresh_uri_in_term + ~refresh_uri_in_reference t, n) type binding = | NoBinding @@ -62,7 +66,7 @@ type db = { Ast.term, (Ast.term Ast.capture_variable list * Ast.term Ast.capture_variable * Ast.term * int) list, - Ast.term list * Ast.term option) grammars; + Ast.term list * Ast.term option, Env.ident_or_var) grammars; keywords: string list; items: (string * Ast.term * (NotationEnv.t -> Ast.location -> Ast.term)) list } @@ -81,7 +85,10 @@ let level_of precedence = string_of_int precedence let gram_symbol s = Gramext.Stoken ("SYMBOL", s) -let gram_ident s = Gramext.Stoken ("IDENT", s) +let gram_ident status = + Gramext.Snterm (Grammar.Entry.obj + (status#notation_parser_db.grammars.ident : 'a Grammar.Entry.e)) + (*Gramext.Stoken ("IDENT", s)*) let gram_number s = Gramext.Stoken ("NUMBER", s) let gram_keyword s = Gramext.Stoken ("", s) let gram_term status = function @@ -111,7 +118,7 @@ let make_action action bindings = aux ((name, (Env.TermType l, Env.TermValue v))::vl) tl) | Binding (name, Env.StringType) :: tl -> Gramext.action - (fun (v:string) -> + (fun (v:Env.ident_or_var) -> aux ((name, (Env.StringType, Env.StringValue v)) :: vl) tl) | Binding (name, Env.NumType) :: tl -> Gramext.action @@ -215,7 +222,7 @@ let extract_term_production status pattern = | Ast.NumVar s -> [Binding (s, Env.NumType), gram_number ""] | Ast.TermVar (s,(Ast.Self level|Ast.Level level as lv)) -> [Binding (s, Env.TermType level), gram_term status lv] - | Ast.IdentVar s -> [Binding (s, Env.StringType), gram_ident ""] + | Ast.IdentVar s -> [Binding (s, Env.StringType), gram_ident status] | Ast.Ascription (p, s) -> assert false (* TODO *) | Ast.FreshVar _ -> assert false and inner_pattern p = @@ -368,10 +375,6 @@ let parse_level2_meta grammars lexbuf = exc_located_wrapper (fun () -> Grammar.Entry.parse grammars.level2_meta (Obj.magic lexbuf)) -let parse_term grammars lexbuf = - exc_located_wrapper - (fun () -> (Grammar.Entry.parse grammars.term (Obj.magic lexbuf))) - (* create empty precedence level for "term" *) let initialize_grammars grammars = let dummy_action = @@ -553,9 +556,10 @@ END let level2_ast = grammars.level2_ast in let term = grammars.term in let let_defs = grammars.let_defs in + let ident = grammars.ident in let protected_binder_vars = grammars.protected_binder_vars in EXTEND - GLOBAL: level2_ast term let_defs protected_binder_vars; + GLOBAL: level2_ast term let_defs protected_binder_vars ident; level2_ast: [ [ p = term -> p ] ]; sort: [ [ "Prop" -> `Prop @@ -632,6 +636,19 @@ EXTEND | _ -> failwith "Invalid index name." ] ]; + ident: [ + [ name = IDENT -> Env.Ident name + | blob = UNPARSED_META -> + let meta = parse_level2_meta grammars (Ulexing.from_utf8_string blob) in + match meta with + | Ast.Variable (Ast.FreshVar _) -> + (* it makes sense: extend Env.ident_or_var *) + assert false + | Ast.Variable (Ast.IdentVar name) -> Env.Var name + | Ast.Variable (Ast.TermVar ("_",_)) -> Env.Var "_" + | _ -> failwith ("Invalid index name: " ^ blob) + ] + ]; let_defs: [ [ defs = LIST1 [ name = single_arg; @@ -776,6 +793,7 @@ let initial_grammars keywords = Grammar.Entry.create level1_pattern_grammar "level1_pattern" in let level2_ast = Grammar.Entry.create level2_ast_grammar "level2_ast" in let term = Grammar.Entry.create level2_ast_grammar "term" in + let ident = Grammar.Entry.create level2_ast_grammar "ident" in let let_defs = Grammar.Entry.create level2_ast_grammar "let_defs" in let protected_binder_vars = Grammar.Entry.create level2_ast_grammar "protected_binder_vars" in @@ -783,6 +801,7 @@ let initial_grammars keywords = initialize_grammars { level1_pattern=level1_pattern; level2_ast=level2_ast; term=term; + ident=ident; let_defs=let_defs; protected_binder_vars=protected_binder_vars; level2_meta=level2_meta; @@ -820,7 +839,7 @@ let extend (status : #status) (CL1P (level1_pattern,precedence)) action = (make_action (fun (env: NotationEnv.t) (loc: Ast.location) -> (action env loc)) - p_bindings) ]]]; + p_bindings) ]]]; status in let current_item = @@ -842,8 +861,6 @@ let parse_level2_ast status = parse_level2_ast status#notation_parser_db.grammars let parse_level2_meta status = parse_level2_meta status#notation_parser_db.grammars -let parse_term status = - parse_term status#notation_parser_db.grammars let level2_ast_grammar status = status#notation_parser_db.grammars.level2_ast_grammar