1(*
2 * @TAG(OTHER_PRINCETON_OSS)
3 *)
4(* Modified by sweeks@acm.org on 2000-8-24.
5 * Ported to MLton.
6 *)
7type int = Int.int
8
9(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi
10 *
11 * $Log$
12 * Revision 1.1  2006/06/22 07:40:27  michaeln
13 * Add a MoscowML compilable implementation of MLyacc, using the MLton sources
14 * as the base.
15 *
16 * Revision 1.1.1.1  1997/01/14 01:38:06  george
17 *   Version 109.24
18 *
19 * Revision 1.1.1.1  1996/01/31  16:01:46  george
20 * Version 109
21 *
22 *)
23
24signature ORDSET =
25   sig
26      type set
27      type elem
28      exception Select_arb
29      val app : (elem -> unit) -> set -> unit
30          and card: set -> int
31          and closure: set * (elem -> set) -> set
32          and difference: set * set -> set
33          and elem_eq: (elem * elem -> bool)
34          and elem_gt : (elem * elem -> bool)
35          and empty: set
36          and exists: (elem * set) -> bool
37          and find : (elem * set)  ->  elem option
38          and fold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b
39          and insert: (elem * set) -> set
40          and is_empty: set -> bool
41          and make_list: set -> elem list
42          and make_set: (elem list -> set)
43          and partition: (elem -> bool) -> (set -> set * set)
44          and remove: (elem * set) -> set
45          and revfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b
46          and select_arb: set -> elem
47          and set_eq: (set * set) -> bool
48          and set_gt: (set * set) -> bool
49          and singleton: (elem -> set)
50          and union: set * set -> set
51   end
52
53signature TABLE =
54   sig
55        type 'a table
56        type key
57        val size : 'a table -> int
58        val empty: 'a table
59        val exists: (key * 'a table) -> bool
60        val find : (key * 'a table)  ->  'a option
61        val insert: ((key * 'a) * 'a table) -> 'a table
62        val make_table : (key * 'a ) list -> 'a table
63        val make_list : 'a table -> (key * 'a) list
64        val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b
65   end
66
67signature HASH =
68  sig
69    type table
70    type elem
71
72    val size : table -> int
73    val add : elem * table -> table
74    val find : elem * table -> int option
75    val exists : elem * table -> bool
76    val empty : table
77  end;
78
79(* Modified by sweeks@acm.org on 2000-8-24.
80 * Ported to MLton.
81 *)
82type int = Int.int
83
84(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi
85 *
86 * $Log$
87 * Revision 1.1  2006/06/22 07:40:27  michaeln
88 * Add a MoscowML compilable implementation of MLyacc, using the MLton sources
89 * as the base.
90 *
91 * Revision 1.1.1.1  1998/04/08 18:40:17  george
92 * Version 110.5
93 *
94 * Revision 1.1.1.1  1997/01/14 01:38:06  george
95 *   Version 109.24
96 *
97 * Revision 1.1.1.1  1996/01/31  16:01:47  george
98 * Version 109
99 *
100 *)
101
102(* Implementation of ordered sets using ordered lists and red-black trees.  The
103   code for red-black trees was originally written by Norris Boyd, which was
104   modified for use here.
105*)
106
107(* ordered sets implemented using ordered lists.
108
109   Upper bound running times for functions implemented here:
110
111   app  = O(n)
112   card = O(n)
113   closure = O(n^2)
114   difference = O(n+m), where n,m = the size of the two sets used here.
115   empty = O(1)
116   exists = O(n)
117   find = O(n)
118   fold = O(n)
119   insert = O(n)
120   is_empty = O(1)
121   make_list = O(1)
122   make_set = O(n^2)
123   partition = O(n)
124   remove = O(n)
125   revfold = O(n)
126   select_arb = O(1)
127   set_eq = O(n), where n = the cardinality of the smaller set
128   set_gt = O(n), ditto
129   singleton = O(1)
130   union = O(n+m)
131*)
132
133functor ListOrdSet(B : sig type elem
134                          val gt : elem * elem -> bool
135                        val eq : elem * elem -> bool
136                    end ) : ORDSET =
137
138struct
139 type elem = B.elem
140 val elem_gt = B.gt
141 val elem_eq = B.eq
142
143 type set = elem list
144 exception Select_arb
145 val empty = nil
146
147 val insert = fn (key,s) =>
148        let fun f (l as (h::t)) =
149                 if elem_gt(key,h) then h::(f t)
150                 else if elem_eq(key,h) then key::t
151                 else key::l
152               | f nil = [key]
153        in f s
154        end
155
156 val select_arb = fn nil => raise Select_arb
157                    | a::b => a
158
159 val exists = fn (key,s) =>
160        let fun f (h::t) = if elem_gt(key,h) then f t
161                           else elem_eq(h,key)
162               | f nil = false
163        in f s
164        end
165
166 val find = fn (key,s) =>
167        let fun f (h::t) = if elem_gt(key,h) then f t
168                           else if elem_eq(h,key) then SOME h
169                           else NONE
170               | f nil = NONE
171        in f s
172        end
173
174 fun revfold f lst init = List.foldl f init lst
175 fun fold f lst init = List.foldr f init lst
176 val app = List.app
177
178fun set_eq(h::t,h'::t') =
179        (case elem_eq(h,h')
180          of true => set_eq(t,t')
181           | a => a)
182  | set_eq(nil,nil) = true
183  | set_eq _ = false
184
185fun set_gt(h::t,h'::t') =
186        (case elem_gt(h,h')
187          of false => (case (elem_eq(h,h'))
188                        of true => set_gt(t,t')
189                         | a => a)
190           |  a => a)
191  | set_gt(_::_,nil) = true
192  | set_gt _ = false
193
194fun union(a as (h::t),b as (h'::t')) =
195          if elem_gt(h',h) then h::union(t,b)
196          else if elem_eq(h,h') then h::union(t,t')
197          else h'::union(a,t')
198  | union(nil,s) = s
199  | union(s,nil) = s
200
201val make_list = fn s => s
202
203val is_empty = fn nil => true | _ => false
204
205val make_set = fn l => List.foldr insert [] l
206
207val partition = fn f => fn s =>
208    fold (fn (e,(yes,no)) =>
209            if (f e) then (e::yes,no) else (e::no,yes)) s (nil,nil)
210
211val remove = fn (e,s) =>
212    let fun f (l as (h::t)) = if elem_gt(h,e) then l
213                              else if elem_eq(h,e) then t
214                              else h::(f t)
215          | f nil = nil
216    in f s
217    end
218
219 (* difference: X-Y *)
220
221 fun difference (nil,_) = nil
222   | difference (r,nil) = r
223   | difference (a as (h::t),b as (h'::t')) =
224          if elem_gt (h',h) then h::difference(t,b)
225          else if elem_eq(h',h) then difference(t,t')
226          else difference(a,t')
227
228 fun singleton X = [X]
229
230 fun card(S): int = fold (fn (a,count) => count+1) S 0
231
232      local
233            fun closure'(from, f, result) =
234              if is_empty from then result
235              else
236                let val (more,result) =
237                        fold (fn (a,(more',result')) =>
238                                let val more = f a
239                                    val new = difference(more,result)
240                                in (union(more',new),union(result',new))
241                                end) from
242                                 (empty,result)
243                in closure'(more,f,result)
244                end
245      in
246         fun closure(start, f) = closure'(start, f, start)
247      end
248end
249
250(* ordered set implemented using red-black trees:
251
252   Upper bound running time of the functions below:
253
254   app: O(n)
255   card: O(n)
256   closure: O(n^2 ln n)
257   difference: O(n ln n)
258   empty: O(1)
259   exists: O(ln n)
260   find: O(ln n)
261   fold: O(n)
262   insert: O(ln n)
263   is_empty: O(1)
264   make_list: O(n)
265   make_set: O(n ln n)
266   partition: O(n ln n)
267   remove: O(n ln n)
268   revfold: O(n)
269   select_arb: O(1)
270   set_eq: O(n)
271   set_gt: O(n)
272   singleton: O(1)
273   union: O(n ln n)
274*)
275
276functor RbOrdSet (B : sig type elem
277                         val eq : (elem*elem) -> bool
278                          val gt : (elem*elem) -> bool
279                     end
280                ) : ORDSET =
281struct
282
283 type elem = B.elem
284 val elem_gt = B.gt
285 val elem_eq = B.eq
286
287 datatype Color = RED | BLACK
288
289 abstype set = EMPTY | TREE of (B.elem * Color * set * set)
290 with exception Select_arb
291      val empty = EMPTY
292
293 fun insert(key,t) =
294  let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY)
295        | f (TREE(k,BLACK,l,r)) =
296            if elem_gt (key,k)
297            then case f r
298                 of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) =>
299                        (case l
300                         of TREE(lk,RED,ll,lr) =>
301                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
302                                           TREE(rk,BLACK,rl,rr))
303                          | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll),
304                                                TREE(rk,RED,rlr,rr)))
305                  | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) =>
306                        (case l
307                         of TREE(lk,RED,ll,lr) =>
308                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
309                                           TREE(rk,BLACK,rl,rr))
310                          | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr))
311                  | r => TREE(k,BLACK,l,r)
312            else if elem_gt(k,key)
313            then case f l
314                 of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) =>
315                        (case r
316                         of TREE(rk,RED,rl,rr) =>
317                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
318                                           TREE(rk,BLACK,rl,rr))
319                          | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl),
320                                                TREE(k,RED,lrr,r)))
321                  | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) =>
322                        (case r
323                         of TREE(rk,RED,rl,rr) =>
324                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
325                                           TREE(rk,BLACK,rl,rr))
326                          | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r)))
327                  | l => TREE(k,BLACK,l,r)
328            else TREE(key,BLACK,l,r)
329        | f (TREE(k,RED,l,r)) =
330            if elem_gt(key,k) then TREE(k,RED,l, f r)
331            else if elem_gt(k,key) then TREE(k,RED, f l, r)
332            else TREE(key,RED,l,r)
333   in case f t
334      of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r)
335       | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r)
336       | t => t
337  end
338
339 fun select_arb (TREE(k,_,l,r)) = k
340   | select_arb EMPTY = raise Select_arb
341
342 fun exists(key,t) =
343  let fun look EMPTY = false
344        | look (TREE(k,_,l,r)) =
345                if elem_gt(k,key) then look l
346                else if elem_gt(key,k) then look r
347                else true
348   in look t
349   end
350
351 fun find(key,t) =
352  let fun look EMPTY = NONE
353        | look (TREE(k,_,l,r)) =
354                if elem_gt(k,key) then look l
355                else if elem_gt(key,k) then look r
356                else SOME k
357   in look t
358  end
359
360  fun revfold f t start =
361     let fun scan (EMPTY,value) = value
362           | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value)))
363     in scan(t,start)
364     end
365
366   fun fold f t start =
367        let fun scan(EMPTY,value) = value
368              | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value)))
369        in scan(t,start)
370        end
371
372   fun app f t =
373      let fun scan EMPTY = ()
374            | scan(TREE(k,_,l,r)) = (scan l; f k; scan r)
375      in scan t
376      end
377
378(* equal_tree : test if two trees are equal.  Two trees are equal if
379   the set of leaves are equal *)
380
381   fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) =
382     let datatype pos = L | R | M
383         exception Done
384         fun getvalue(stack as ((a,position)::b)) =
385            (case a
386             of (TREE(k,_,l,r)) =>
387                (case position
388                 of L => getvalue ((l,L)::(a,M)::b)
389                  | M => (k,case r of  EMPTY => b | _ => (a,R)::b)
390                  | R => getvalue ((r,L)::b)
391                 )
392              | EMPTY => getvalue b
393             )
394            | getvalue(nil) = raise Done
395          fun f (nil,nil) = true
396            | f (s1 as (_ :: _),s2 as (_ :: _ )) =
397                          let val (v1,news1) = getvalue s1
398                              and (v2,news2) = getvalue s2
399                          in (elem_eq(v1,v2)) andalso f(news1,news2)
400                          end
401            | f _ = false
402      in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false
403      end
404    | set_eq (EMPTY,EMPTY) = true
405    | set_eq _ = false
406
407   (* gt_tree : Test if tree1 is greater than tree 2 *)
408
409   fun set_gt (tree1,tree2) =
410     let datatype pos = L | R | M
411         exception Done
412         fun getvalue(stack as ((a,position)::b)) =
413            (case a
414             of (TREE(k,_,l,r)) =>
415                (case position
416                 of L => getvalue ((l,L)::(a,M)::b)
417                  | M => (k,case r of EMPTY => b | _ => (a,R)::b)
418                  | R => getvalue ((r,L)::b)
419                 )
420              | EMPTY => getvalue b
421             )
422            | getvalue(nil) = raise Done
423          fun f (nil,nil) = false
424            | f (s1 as (_ :: _),s2 as (_ :: _ )) =
425                          let val (v1,news1) = getvalue s1
426                              and (v2,news2) = getvalue s2
427                          in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2))
428                          end
429            | f (_,nil) = true
430            | f (nil,_) = false
431      in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false
432      end
433
434      fun is_empty S = (let val _ = select_arb S in false end
435                         handle Select_arb => true)
436
437      fun make_list S = fold (op ::) S nil
438
439      fun make_set l = List.foldr insert empty l
440
441      fun partition F S = fold (fn (a,(Yes,No)) =>
442                                if F(a) then (insert(a,Yes),No)
443                                else (Yes,insert(a,No)))
444                             S (empty,empty)
445
446      fun remove(X, XSet) =
447             let val (YSet, _) =
448                        partition (fn a => not (elem_eq (X, a))) XSet
449             in  YSet
450             end
451
452      fun difference(Xs, Ys) =
453           fold (fn (p as (a,Xs')) =>
454                      if exists(a,Ys) then Xs' else insert p)
455           Xs empty
456
457      fun singleton X = insert(X,empty)
458
459      fun card(S): int = fold (fn (_,count) => count+1) S 0
460
461      fun union(Xs,Ys)= fold insert Ys Xs
462
463      local
464            fun closure'(from, f, result) =
465              if is_empty from then result
466              else
467                let val (more,result) =
468                        fold (fn (a,(more',result')) =>
469                                let val more = f a
470                                    val new = difference(more,result)
471                                in (union(more',new),union(result',new))
472                                end) from
473                                 (empty,result)
474                in closure'(more,f,result)
475                end
476      in
477         fun closure(start, f) = closure'(start, f, start)
478      end
479   end
480end
481
482(* In utils.sig
483signature TABLE =
484   sig
485        type 'a table
486        type key
487        val size : 'a table -> int
488        val empty: 'a table
489        val exists: (key * 'a table) -> bool
490        val find : (key * 'a table)  ->  'a option
491        val insert: ((key * 'a) * 'a table) -> 'a table
492        val make_table : (key * 'a ) list -> 'a table
493        val make_list : 'a table -> (key * 'a) list
494        val fold : ((key * 'a) * 'b -> 'b) -> 'a table -> 'b -> 'b
495   end
496*)
497
498functor Table (B : sig type key
499                      val gt : (key * key) -> bool
500                     end
501                ) : TABLE =
502struct
503
504 datatype Color = RED | BLACK
505 type key = B.key
506
507 abstype 'a table = EMPTY
508                  | TREE of ((B.key * 'a ) * Color * 'a table * 'a table)
509 with
510
511 val empty = EMPTY
512
513 fun insert(elem as (key,data),t) =
514  let val key_gt = fn (a,_) => B.gt(key,a)
515      val key_lt = fn (a,_) => B.gt(a,key)
516        fun f EMPTY = TREE(elem,RED,EMPTY,EMPTY)
517        | f (TREE(k,BLACK,l,r)) =
518            if key_gt k
519            then case f r
520                 of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) =>
521                        (case l
522                         of TREE(lk,RED,ll,lr) =>
523                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
524                                           TREE(rk,BLACK,rl,rr))
525                          | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll),
526                                                TREE(rk,RED,rlr,rr)))
527                  | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) =>
528                        (case l
529                         of TREE(lk,RED,ll,lr) =>
530                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
531                                           TREE(rk,BLACK,rl,rr))
532                          | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr))
533                  | r => TREE(k,BLACK,l,r)
534            else if key_lt k
535            then case f l
536                 of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) =>
537                        (case r
538                         of TREE(rk,RED,rl,rr) =>
539                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
540                                           TREE(rk,BLACK,rl,rr))
541                          | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl),
542                                                TREE(k,RED,lrr,r)))
543                  | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) =>
544                        (case r
545                         of TREE(rk,RED,rl,rr) =>
546                                TREE(k,RED,TREE(lk,BLACK,ll,lr),
547                                           TREE(rk,BLACK,rl,rr))
548                          | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r)))
549                  | l => TREE(k,BLACK,l,r)
550            else TREE(elem,BLACK,l,r)
551        | f (TREE(k,RED,l,r)) =
552            if key_gt k then TREE(k,RED,l, f r)
553            else if key_lt k then TREE(k,RED, f l, r)
554            else TREE(elem,RED,l,r)
555   in case f t
556      of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r)
557       | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r)
558       | t => t
559  end
560
561 fun exists(key,t) =
562  let fun look EMPTY = false
563        | look (TREE((k,_),_,l,r)) =
564                if B.gt(k,key) then look l
565                else if B.gt(key,k) then look r
566                else true
567   in look t
568   end
569
570 fun find(key,t) =
571  let fun look EMPTY = NONE
572        | look (TREE((k,data),_,l,r)) =
573                if B.gt(k,key) then look l
574                else if B.gt(key,k) then look r
575                else SOME data
576   in look t
577  end
578
579  fun fold f t start =
580        let fun scan(EMPTY,value) = value
581              | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value)))
582        in scan(t,start)
583        end
584
585  fun make_table l = List.foldr insert empty l
586
587  fun size S : int = fold (fn (_,count) => count+1) S 0
588
589  fun make_list table = fold (op ::) table nil
590
591  end
592end;
593
594(* assumes that a functor Table with signature TABLE from table.sml is
595   in the environment *)
596
597(* In utils.sig
598signature HASH =
599  sig
600    type table
601    type elem
602
603    val size : table -> int
604    val add : elem * table -> table
605    val find : elem * table -> int option
606    val exists : elem * table -> bool
607    val empty : table
608  end
609*)
610
611(* hash: creates a hash table of size n which assigns each distinct member
612   a unique integer between 0 and n-1 *)
613
614functor Hash(B : sig type elem
615                     val gt : elem * elem -> bool
616                 end) : HASH =
617struct
618    type elem=B.elem
619    structure HashTable = Table(type key=B.elem
620                                val gt = B.gt)
621
622    type table = {count : int, table : int HashTable.table}
623
624    val empty: table = {count=0,table=HashTable.empty}
625    val size = fn {count,table} => count
626    val add = fn (e,{count,table}) =>
627       ({count=count+1,table=HashTable.insert((e,count),table)}: table)
628    val find = fn (e,{table,count}) => HashTable.find(e,table)
629    val exists = fn (e,{table,count}) => HashTable.exists(e,table)
630end;
631