Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlyacc / src / core.sml
CommitLineData
7f918cf1
CE
1(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
2
3functor 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
73end;