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