Commit | Line | Data |
---|---|---|
7f918cf1 CE |
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; |