src/Pure/Isar/keyword.ML
changeset 58920 2f8168dc0eac
parent 58919 82a71046dce8
child 58923 cb9b69cca999
equal deleted inserted replaced
58919:82a71046dce8 58920:2f8168dc0eac
    35   val spec: spec -> T
    35   val spec: spec -> T
    36   val command_spec: (string * spec) * Position.T -> (string * T) * Position.T
    36   val command_spec: (string * spec) * Position.T -> (string * T) * Position.T
    37   type keywords
    37   type keywords
    38   val minor_keywords: keywords -> Scan.lexicon
    38   val minor_keywords: keywords -> Scan.lexicon
    39   val major_keywords: keywords -> Scan.lexicon
    39   val major_keywords: keywords -> Scan.lexicon
       
    40   val no_command_keywords: keywords -> keywords
    40   val empty_keywords: keywords
    41   val empty_keywords: keywords
    41   val merge_keywords: keywords * keywords -> keywords
    42   val merge_keywords: keywords * keywords -> keywords
    42   val no_command_keywords: keywords -> keywords
    43   val add_keywords: string * T option -> keywords -> keywords
    43   val add: string * T option -> keywords -> keywords
       
    44   val define: string * T option -> unit
    44   val define: string * T option -> unit
    45   val get_keywords: unit -> keywords
    45   val get_keywords: unit -> keywords
    46   val is_keyword: keywords -> string -> bool
    46   val is_keyword: keywords -> string -> bool
    47   val command_keyword: string -> T option
    47   val command_keyword: string -> T option
    48   val command_files: string -> Path.T -> Path.T list
    48   val command_files: string -> Path.T -> Path.T list
   140   Keywords {minor = minor, major = major, commands = commands};
   140   Keywords {minor = minor, major = major, commands = commands};
   141 
   141 
   142 fun map_keywords f (Keywords {minor, major, commands}) =
   142 fun map_keywords f (Keywords {minor, major, commands}) =
   143   make_keywords (f (minor, major, commands));
   143   make_keywords (f (minor, major, commands));
   144 
   144 
       
   145 val no_command_keywords =
       
   146   map_keywords (fn (minor, _, _) => (minor, Scan.empty_lexicon, Symtab.empty));
       
   147 
       
   148 
       
   149 (* build keywords *)
       
   150 
   145 val empty_keywords =
   151 val empty_keywords =
   146   make_keywords (Scan.empty_lexicon, Scan.empty_lexicon, Symtab.empty);
   152   make_keywords (Scan.empty_lexicon, Scan.empty_lexicon, Symtab.empty);
   147 
   153 
   148 fun merge_keywords
   154 fun merge_keywords
   149   (Keywords {minor = minor1, major = major1, commands = commands1},
   155   (Keywords {minor = minor1, major = major1, commands = commands1},
   151   make_keywords
   157   make_keywords
   152    (Scan.merge_lexicons (minor1, minor2),
   158    (Scan.merge_lexicons (minor1, minor2),
   153     Scan.merge_lexicons (major1, major2),
   159     Scan.merge_lexicons (major1, major2),
   154     Symtab.merge (K true) (commands1, commands2));
   160     Symtab.merge (K true) (commands1, commands2));
   155 
   161 
   156 val no_command_keywords =
   162 fun add_keywords (name, opt_kind) = map_keywords (fn (minor, major, commands) =>
   157   map_keywords (fn (minor, _, _) => (minor, Scan.empty_lexicon, Symtab.empty));
       
   158 
       
   159 
       
   160 (* add keywords *)
       
   161 
       
   162 fun add (name, opt_kind) = map_keywords (fn (minor, major, commands) =>
       
   163   (case opt_kind of
   163   (case opt_kind of
   164     NONE =>
   164     NONE =>
   165       let
   165       let
   166         val minor' = Scan.extend_lexicon (Symbol.explode name) minor;
   166         val minor' = Scan.extend_lexicon (Symbol.explode name) minor;
   167       in (minor', major, commands) end
   167       in (minor', major, commands) end
   174 
   174 
   175 (* global state *)
   175 (* global state *)
   176 
   176 
   177 local val global_keywords = Unsynchronized.ref empty_keywords in
   177 local val global_keywords = Unsynchronized.ref empty_keywords in
   178 
   178 
   179 fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add decl));
   179 fun define decl = CRITICAL (fn () => Unsynchronized.change global_keywords (add_keywords decl));
   180 fun get_keywords () = ! global_keywords;
   180 fun get_keywords () = ! global_keywords;
   181 
   181 
   182 end;
   182 end;
   183 
   183 
   184 fun get_commands () = commands (get_keywords ());
   184 fun get_commands () = commands (get_keywords ());