| 1 | (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *) |
| 2 | |
| 3 | functor mkCore(structure IntGrammar : INTGRAMMAR) : CORE = |
| 4 | struct |
| 5 | open IntGrammar |
| 6 | open Grammar |
| 7 | structure IntGrammar = IntGrammar |
| 8 | structure Grammar = Grammar |
| 9 | |
| 10 | datatype item = ITEM of |
| 11 | { rule : rule, |
| 12 | dot : int, |
| 13 | rhsAfter : symbol list |
| 14 | } |
| 15 | |
| 16 | val eqItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, |
| 17 | ITEM{rule=RULE{num=m,...},dot=e,...}) => |
| 18 | n=m andalso d=e |
| 19 | |
| 20 | val gtItem = fn (ITEM{rule=RULE{num=n,...},dot=d,...}, |
| 21 | ITEM{rule=RULE{num=m,...},dot=e,...}) => |
| 22 | n>m orelse (n=m andalso d>e) |
| 23 | |
| 24 | structure ItemList = ListOrdSet |
| 25 | (struct |
| 26 | type elem = item |
| 27 | val eq = eqItem |
| 28 | val gt = gtItem |
| 29 | end) |
| 30 | |
| 31 | open ItemList |
| 32 | datatype core = CORE of item list * int |
| 33 | |
| 34 | val gtCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_gt(a,b) |
| 35 | val eqCore = fn (CORE (a,_),CORE (b,_)) => ItemList.set_eq(a,b) |
| 36 | |
| 37 | (* functions for printing and debugging *) |
| 38 | |
| 39 | val prItem = fn (symbolToString,nontermToString,print) => |
| 40 | let val printInt = print o (Int.toString : int -> string) |
| 41 | val prSymbol = print o symbolToString |
| 42 | val prNonterm = print o nontermToString |
| 43 | fun showRest nil = () |
| 44 | | showRest (h::t) = (prSymbol h; print " "; showRest t) |
| 45 | fun showRhs (l,0) = (print ". "; showRest l) |
| 46 | | showRhs (nil,_) = () |
| 47 | | showRhs (h::t,n) = (prSymbol h; |
| 48 | print " "; |
| 49 | showRhs(t,n-1)) |
| 50 | in fn (ITEM {rule=RULE {lhs,rhs,rulenum,num,...}, |
| 51 | dot,rhsAfter,...}) => |
| 52 | (prNonterm lhs; print " : "; showRhs(rhs,dot); |
| 53 | case rhsAfter |
| 54 | of nil => (print " (reduce by rule "; |
| 55 | printInt rulenum; |
| 56 | print ")") |
| 57 | | _ => (); |
| 58 | if DEBUG then |
| 59 | (print " (num "; printInt num; print ")") |
| 60 | else ()) |
| 61 | end |
| 62 | |
| 63 | val prCore = fn a as (_,_,print) => |
| 64 | let val prItem = prItem a |
| 65 | in fn (CORE (items,state)) => |
| 66 | (print "state "; |
| 67 | print (Int.toString state); |
| 68 | print ":\n\n"; |
| 69 | app (fn i => (print "\t"; |
| 70 | prItem i; print "\n")) items; |
| 71 | print "\n") |
| 72 | end |
| 73 | end; |