src/Pure/Syntax/lexicon.ML
changeset 330 2fda15dd1e0f
parent 237 a7d3e712767a
child 376 d3d01131470f
equal deleted inserted replaced
329:92586a978648 330:2fda15dd1e0f
    38 signature LEXICON =
    38 signature LEXICON =
    39 sig
    39 sig
    40   include SCANNER
    40   include SCANNER
    41   include LEXICON0
    41   include LEXICON0
    42   val is_xid: string -> bool
    42   val is_xid: string -> bool
    43   val is_tfree: string -> bool
    43   val is_tid: string -> bool
    44   type lexicon
    44   type lexicon
    45   datatype token =
    45   datatype token =
    46     Token of string |
    46     Token of string |
    47     IdentSy of string |
    47     IdentSy of string |
    48     VarSy of string |
    48     VarSy of string |
    49     TFreeSy of string |
    49     TFreeSy of string |
    50     TVarSy of string |
    50     TVarSy of string |
    51     EndToken
    51     EndToken
    52   val id: string
    52   val id: string
    53   val var: string
    53   val var: string
    54   val tfree: string
    54   val tid: string
    55   val tvar: string
    55   val tvar: string
    56   val terminals: string list
    56   val terminals: string list
    57   val is_terminal: string -> bool
    57   val is_terminal: string -> bool
    58   val str_of_token: token -> string
    58   val str_of_token: token -> string
    59   val display_token: token -> string
    59   val display_token: token -> string
    60   val matching_tokens: token * token -> bool
    60   val matching_tokens: token * token -> bool
       
    61   val token_assoc: (token option * 'a list) list * token -> 'a list
    61   val valued_token: token -> bool
    62   val valued_token: token -> bool
    62   val predef_term: string -> token option
    63   val predef_term: string -> token option
    63   val dest_lexicon: lexicon -> string list
    64   val dest_lexicon: lexicon -> string list
    64   val empty_lexicon: lexicon
    65   val empty_lexicon: lexicon
    65   val extend_lexicon: lexicon -> string list -> lexicon
    66   val extend_lexicon: lexicon -> string list -> lexicon
    81 fun is_xid s =
    82 fun is_xid s =
    82   (case explode s of
    83   (case explode s of
    83     "_" :: cs => is_ident cs
    84     "_" :: cs => is_ident cs
    84   | cs => is_ident cs);
    85   | cs => is_ident cs);
    85 
    86 
    86 fun is_tfree s =
    87 fun is_tid s =
    87   (case explode s of
    88   (case explode s of
    88     "'" :: cs => is_ident cs
    89     "'" :: cs => is_ident cs
    89   | _ => false);
    90   | _ => false);
    90 
    91 
    91 
    92 
   116 
   117 
   117 (* terminal arguments *)
   118 (* terminal arguments *)
   118 
   119 
   119 val id = "id";
   120 val id = "id";
   120 val var = "var";
   121 val var = "var";
   121 val tfree = "tfree";
   122 val tid = "tid";
   122 val tvar = "tvar";
   123 val tvar = "tvar";
   123 
   124 
   124 val terminals = [id, var, tfree, tvar];
   125 val terminals = [id, var, tid, tvar];
   125 
   126 
   126 fun is_terminal s = s mem terminals;
   127 fun is_terminal s = s mem terminals;
   127 
   128 
   128 
   129 
   129 (* str_of_token *)
   130 (* str_of_token *)
   139 (* display_token *)
   140 (* display_token *)
   140 
   141 
   141 fun display_token (Token s) = quote s
   142 fun display_token (Token s) = quote s
   142   | display_token (IdentSy s) = "id(" ^ s ^ ")"
   143   | display_token (IdentSy s) = "id(" ^ s ^ ")"
   143   | display_token (VarSy s) = "var(" ^ s ^ ")"
   144   | display_token (VarSy s) = "var(" ^ s ^ ")"
   144   | display_token (TFreeSy s) = "tfree(" ^ s ^ ")"
   145   | display_token (TFreeSy s) = "tid(" ^ s ^ ")"
   145   | display_token (TVarSy s) = "tvar(" ^ s ^ ")"
   146   | display_token (TVarSy s) = "tvar(" ^ s ^ ")"
   146   | display_token EndToken = "";
   147   | display_token EndToken = "";
   147 
   148 
   148 
   149 
   149 (* matching_tokens *)
   150 (* matching_tokens *)
   155   | matching_tokens (TVarSy _, TVarSy _) = true
   156   | matching_tokens (TVarSy _, TVarSy _) = true
   156   | matching_tokens (EndToken, EndToken) = true
   157   | matching_tokens (EndToken, EndToken) = true
   157   | matching_tokens _ = false;
   158   | matching_tokens _ = false;
   158 
   159 
   159 
   160 
       
   161 (* this function is needed in parser.ML but is placed here 
       
   162    for better performance *)
       
   163 fun token_assoc (list, key) =
       
   164   let fun assoc [] = []
       
   165         | assoc ((keyi, xi) :: pairs) =
       
   166             if is_none keyi orelse matching_tokens (the keyi, key) then 
       
   167               (assoc pairs) @ xi
       
   168             else assoc pairs;
       
   169   in assoc list end;
       
   170 
       
   171 
   160 (* valued_token *)
   172 (* valued_token *)
   161 
   173 
   162 fun valued_token (Token _) = false
   174 fun valued_token (Token _) = false
   163   | valued_token (IdentSy _) = true
   175   | valued_token (IdentSy _) = true
   164   | valued_token (VarSy _) = true
   176   | valued_token (VarSy _) = true
   170 (* predef_term *)
   182 (* predef_term *)
   171 
   183 
   172 fun predef_term name =
   184 fun predef_term name =
   173   if name = id then Some (IdentSy name)
   185   if name = id then Some (IdentSy name)
   174   else if name = var then Some (VarSy name)
   186   else if name = var then Some (VarSy name)
   175   else if name = tfree then Some (TFreeSy name)
   187   else if name = tid then Some (TFreeSy name)
   176   else if name = tvar then Some (TVarSy name)
   188   else if name = tvar then Some (TVarSy name)
   177   else None;
   189   else None;
   178 
   190 
   179 
   191 
   180 
   192