1 (* ML
-Yacc Parser
Generator (c
) 1989 Andrew W
. Appel
, David R
. Tarditi
*)
3 functor mkCore(structure IntGrammar
: INTGRAMMAR
) : CORE
=
7 structure IntGrammar
= IntGrammar
8 structure Grammar
= Grammar
10 datatype item
= ITEM
of
13 rhsAfter
: symbol list
16 val eqItem
= fn (ITEM
{rule
=RULE
{num
=n
,...},dot
=d
,...},
17 ITEM
{rule
=RULE
{num
=m
,...},dot
=e
,...}) =>
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
)
24 structure ItemList
= ListOrdSet
32 datatype core
= CORE
of item list
* int
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
)
37 (* functions for printing
and debugging
*)
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
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
;
50 in fn (ITEM
{rule
=RULE
{lhs
,rhs
,rulenum
,num
,...},
52 (prNonterm lhs
; print
" : "; showRhs(rhs
,dot
);
54 of nil
=> (print
" (reduce by rule ";
59 (print
" (num "; printInt num
; print
")")
63 val prCore
= fn a
as (_
,_
,print
) =>
64 let val prItem
= prItem a
65 in fn (CORE (items
,state
)) =>
67 print (Int.toString state
);
69 app (fn i
=> (print
"\t";
70 prItem i
; print
"\n")) items
;