src/Pure/Isar/code.ML
changeset 28562 4e74209f113e
parent 28525 42297ae4df47
child 28672 0baf1d9c6780
equal deleted inserted replaced
28561:056255ade52a 28562:4e74209f113e
    94   fun merge _ = AList.merge (op = : string * string -> bool) (K true);
    94   fun merge _ = AList.merge (op = : string * string -> bool) (K true);
    95 );
    95 );
    96 
    96 
    97 fun add_attribute (attr as (name, _)) =
    97 fun add_attribute (attr as (name, _)) =
    98   let
    98   let
    99     fun add_parser ("", parser) attrs = attrs @ [("", parser)]
    99     fun add_parser ("", parser) attrs = attrs |> rev |> AList.update (op =) ("", parser) |> rev
   100       | add_parser (name, parser) attrs = (name, Args.$$$ name |-- parser) :: attrs;
   100       | add_parser (name, parser) attrs = (name, Args.$$$ name |-- parser) :: attrs;
   101     fun error "" = error ("Code attribute already declared")
   101   in CodeAttr.map (fn attrs => if not (name = "") andalso AList.defined (op =) attrs name
   102       | error name = error ("Code attribute " ^ name ^ " already declared")
   102     then error ("Code attribute " ^ name ^ " already declared") else add_parser attr attrs)
   103   in CodeAttr.map (fn attrs => if AList.defined (op =) attrs name
       
   104     then error name else add_parser attr attrs)
       
   105   end;
   103   end;
   106 
   104 
   107 val _ =
   105 val _ =
   108   let
   106   let
   109     val code_attr = Attrib.syntax (Scan.peek (fn context =>
   107     val code_attr = Attrib.syntax (Scan.peek (fn context =>
   635     fun add_del_attribute (name, (add, del)) =
   633     fun add_del_attribute (name, (add, del)) =
   636       add_attribute (name, Args.del |-- Scan.succeed (mk_attribute del)
   634       add_attribute (name, Args.del |-- Scan.succeed (mk_attribute del)
   637         || Scan.succeed (mk_attribute add))
   635         || Scan.succeed (mk_attribute add))
   638   in
   636   in
   639     TypeInterpretation.init
   637     TypeInterpretation.init
   640     #> add_del_attribute ("func", (add_eqn, del_eqn))
   638     #> add_del_attribute ("", (add_eqn, del_eqn))
   641     #> add_simple_attribute ("nbe", add_nonlinear_eqn)
   639     #> add_simple_attribute ("nbe", add_nonlinear_eqn)
   642     #> add_del_attribute ("inline", (add_inline, del_inline))
   640     #> add_del_attribute ("inline", (add_inline, del_inline))
   643     #> add_del_attribute ("post", (add_post, del_post))
   641     #> add_del_attribute ("post", (add_post, del_post))
   644   end));
   642   end));
   645 
   643