src/Pure/Syntax/lexicon.ML
author clasohm
Thu, 16 Sep 1993 12:20:38 +0200
changeset 0 a5a9c433f639
child 18 c9ec452ff08f
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     1
(*  Title:      Lexicon
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    ID:         $Id$
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     3
    Author:     Tobias Nipkow, TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     4
    Copyright   1993  TU Muenchen
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     5
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
The Isabelle Lexer
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
Changes:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     9
TODO:
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    10
  Lexicon -> lexicon, Token -> token
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    11
  end_token -> EndToken ?
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    12
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    13
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    14
signature LEXICON0 =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    15
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    16
  val is_identifier: string -> bool
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    17
  val scan_varname: string list -> indexname * string list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    18
  val string_of_vname: indexname -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    19
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    20
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    21
signature LEXICON =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    22
sig
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    23
  type Lexicon
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    24
  datatype Token = Token of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    25
                 | IdentSy of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    26
                 | VarSy of string * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    27
                 | TFreeSy of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    28
                 | TVarSy of string * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    29
                 | end_token;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    30
  val empty: Lexicon
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    31
  val extend: Lexicon * string list -> Lexicon
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    32
  val matching_tokens: Token * Token -> bool
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    33
  val mk_lexicon: string list -> Lexicon
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    34
  val name_of_token: Token -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    35
  val predef_term: string -> Token
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    36
  val is_terminal: string -> bool
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    37
  val tokenize: Lexicon -> string -> Token list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    38
  val token_to_string: Token -> string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    39
  val valued_token: Token -> bool
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    40
  type 'b TokenMap
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    41
  val mkTokenMap: ('b * Token list) list -> 'b TokenMap
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    42
  val applyTokenMap: 'b TokenMap * Token -> 'b list
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    43
  include LEXICON0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    44
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    45
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    46
functor LexiconFun(Extension: EXTENSION): LEXICON =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    47
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    48
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    49
open Extension;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    50
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    51
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    52
datatype Token = Token of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    53
               | IdentSy of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    54
               | VarSy of string * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    55
               | TFreeSy of string
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    56
               | TVarSy of string * int
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    57
               | end_token;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    58
val no_token = "";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    59
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    60
datatype dfa = Tip | Branch of string * string * dfa * dfa * dfa;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    61
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    62
type Lexicon = dfa;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    63
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    64
fun is_id(c::cs) = is_letter(c) andalso forall is_letdig cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    65
  | is_id([])    = false;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    66
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    67
fun is_identifier s = is_id(explode s);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    68
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    69
val empty = Tip;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    70
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    71
fun extend1(dfa, s) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    72
    let fun add(Branch(c, a, less, eq, gr), cs as (d::ds)) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    73
              if c>d then Branch(c, a, add(less, cs), eq, gr) else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    74
              if c<d then Branch(c, a, less, eq, add(gr, cs)) else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    75
              Branch(c, if null ds then s else a, less, add(eq, ds), gr)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    76
          | add(Tip, c::cs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    77
              Branch(c, if null cs then s else no_token, Tip, add(Tip, cs), Tip)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    78
          | add(dfa, []) = dfa
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    79
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    80
    in add(dfa, explode s) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    81
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    82
val extend = foldl extend1;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    83
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    84
fun mk_lexicon ss = extend(empty, ss);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    85
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    86
fun next_dfa (Tip, _) = None
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    87
  | next_dfa (Branch(d, a, less, eq, gr), c) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    88
      if c<d then next_dfa(less, c) else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    89
      if c>d then next_dfa(gr, c)   else Some(a, eq);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    90
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    91
exception ID of string * string list;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    92
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    93
val eof_id = "End of input - identifier expected.\n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    94
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    95
(*A string of letters, digits, or ' _ *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    96
fun xscan_ident exn =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    97
let fun scan []  =  raise exn(eof_id, [])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    98
      | scan(c::cs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
    99
        if  is_letter c
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   100
        then let val (ds, tail) = take_prefix is_letdig cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   101
             in  (implode(c::ds), tail)  end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   102
        else raise exn("Identifier expected: ", c::cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   103
in scan end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   104
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   105
(*Scan the offset of a Var, if present; otherwise ~1 *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   106
fun scan_offset cs = case cs of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   107
    ("."::[]) => (~1, cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   108
  | ("."::(ds as c::cs')) => if is_digit c then scan_int ds else (~1, cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   109
  | _ => (~1, cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   110
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   111
fun split_varname s =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   112
    let val (rpost, rpref) = take_prefix is_digit (rev(explode s))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   113
        val (i, _) = scan_int(rev rpost)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   114
    in (implode(rev rpref), i) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   115
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   116
fun xscan_varname exn cs : (string*int) * string list =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
let val (a, ds) = xscan_ident exn cs;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   118
    val (i, es) = scan_offset ds
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
in if i = ~1 then (split_varname a, es) else ((a, i), es) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   121
fun scan_varname s = xscan_varname ID s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   122
        handle ID(err, cs) => error(err^(implode cs));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   123
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   124
fun tokenize (dfa) (s:string) : Token list =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   125
let exception LEX_ERR;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   126
    exception FAIL of string * string list;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   127
    val lexerr = "Lexical error: ";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   128
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   129
    fun tokenize1 (_:dfa, []:string list) : Token * string list =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   130
          raise LEX_ERR
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   131
      | tokenize1(dfa, c::cs) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   132
          case next_dfa(dfa, c) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   133
            None => raise LEX_ERR
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   134
          | Some(a, dfa') =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   135
             if a=no_token then tokenize1(dfa', cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   136
             else (tokenize1(dfa', cs) handle LEX_ERR =>
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   137
                   if is_identifier a andalso not(null cs) andalso
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   138
                      is_letdig(hd cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   139
                   then raise LEX_ERR else (Token(a), cs));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   140
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   141
    fun token(cs) = tokenize1(dfa, cs) handle LEX_ERR => raise FAIL(lexerr, cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   142
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   143
    fun id([]) = raise FAIL(eof_id, [])
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   144
      | id(cs as c::cs') =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   145
        if is_letter(c)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   146
        then let val (id, cs'') = xscan_ident FAIL cs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   147
             in (IdentSy(id), cs'') end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   148
        else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   149
        if c = "?"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   150
        then case cs' of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   151
                "'"::xs => let val ((a, i), ys) = xscan_varname FAIL xs
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   152
                           in (TVarSy("'"^a, i), ys) end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   153
             | _ => let val ((a, i), ys) = xscan_varname FAIL cs'
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   154
                    in (VarSy(a, i), ys) end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   155
        else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   156
        if c = "'"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   157
        then let val (a, cs'') = xscan_ident FAIL cs'
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   158
             in (TFreeSy("'" ^ a), cs'') end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   159
        else raise FAIL(lexerr, cs);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   160
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   161
    fun tknize([], ts) = rev(ts)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   162
      | tknize(cs as c::cs', ts) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   163
        if is_blank(c) then tknize(cs', ts) else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   164
        let val (t, cs'') =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   165
                if c="?" then id(cs) handle FAIL _ => token(cs)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   166
                else (token(cs) handle FAIL _ => id(cs))
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   167
        in tknize(cs'', t::ts) end
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   168
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   169
in tknize(explode s, []) handle FAIL(s, cs) => error(s^(implode cs)) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   170
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   171
(*Variables have the form ?nameidx, or ?name.idx if "name" ends with a digit*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   172
fun string_of_vname (a, idx) = case rev(explode a) of
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   173
        []   => "?NULL_VARIABLE_NAME"
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   174
      | c::_ => "?" ^
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   175
                (if is_digit c then a ^ "." ^ string_of_int idx
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   176
                 else if idx = 0 then a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   177
                 else a ^ string_of_int idx);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   178
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   179
fun token_to_string (Token(s)) = s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   180
  | token_to_string (IdentSy(s)) = s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   181
  | token_to_string (VarSy v) = string_of_vname v
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   182
  | token_to_string (TFreeSy a) = a
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   183
  | token_to_string (TVarSy v) = string_of_vname v
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   184
  | token_to_string end_token = "\n";
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   185
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   186
(* MMW *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   187
fun name_of_token (Token s) = quote s
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   188
  | name_of_token (IdentSy _) = id
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   189
  | name_of_token (VarSy _) = var
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   190
  | name_of_token (TFreeSy _) = tfree
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   191
  | name_of_token (TVarSy _) = tvar;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   192
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   193
fun matching_tokens(Token(i), Token(j)) = (i=j) |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   194
    matching_tokens(IdentSy(_), IdentSy(_)) = true |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   195
    matching_tokens(VarSy _, VarSy _) = true |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   196
    matching_tokens(TFreeSy _, TFreeSy _) = true |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   197
    matching_tokens(TVarSy _, TVarSy _) = true |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   198
    matching_tokens(end_token, end_token) = true |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   199
    matching_tokens(_, _) = false;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   200
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   201
fun valued_token(end_token) = false
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   202
  | valued_token(Token _) = false
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   203
  | valued_token(IdentSy _) = true
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   204
  | valued_token(VarSy _) = true
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   205
  | valued_token(TFreeSy _) = true
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   206
  | valued_token(TVarSy _) = true;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   207
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   208
(* MMW *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   209
fun predef_term name =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   210
  if name = id then IdentSy name
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   211
  else if name = var then VarSy (name, 0)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   212
  else if name = tfree then TFreeSy name
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   213
  else if name = tvar then TVarSy (name, 0)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   214
  else end_token;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   215
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   216
(* MMW *)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   217
fun is_terminal s = s mem [id, var, tfree, tvar];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   218
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   219
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   220
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   221
type 'b TokenMap = (Token * 'b list) list * 'b list;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   222
val first_token = 0;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   223
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   224
fun int_of_token(Token(tk)) = first_token |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   225
    int_of_token(IdentSy _) = first_token - 1 |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   226
    int_of_token(VarSy _) = first_token - 2 |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   227
    int_of_token(TFreeSy _) = first_token - 3 |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   228
    int_of_token(TVarSy _) = first_token - 4 |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   229
    int_of_token(end_token) = first_token - 5;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   230
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   231
fun lesstk(s, t) = int_of_token(s) < int_of_token(t) orelse
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   232
                  (case (s, t) of (Token(a), Token(b)) => a<b | _ => false);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   233
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   234
fun mkTokenMap(atll) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   235
    let val aill = atll;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   236
        val dom = sort lesstk (distinct(flat(map snd aill)));
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   237
        val mt = map fst (filter (null o snd) atll);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   238
        fun mktm(i) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   239
            let fun add(l, (a, il)) = if i mem il then a::l else l
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   240
            in (i, foldl add ([], aill)) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   241
    in (map mktm dom, mt) end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   242
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   243
fun find_al (i) =
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   244
    let fun find((j, al)::l) = if lesstk(i, j) then [] else
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   245
                              if matching_tokens(i, j) then al else find l |
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   246
            find [] = [];
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   247
    in find end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   248
fun applyTokenMap((l, mt), tk:Token) = mt@(find_al tk l);
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   249
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   250
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   251
end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   252