1 (* ML
-Yacc Parser
Generator (c
) 1989 Andrew W
. Appel
, David R
. Tarditi
*)
3 functor mkVerbose(structure Errs
: LR_ERRS
) : VERBOSE
=
7 val mkPrintAction
= fn print
=>
8 let val printInt
= print
o (Int.toString
: int -> string)
9 in fn (SHIFT (STATE i
)) =>
14 (print
"\treduce by rule ";
17 | ACCEPT
=> print
"\taccept\n"
18 | ERROR
=> print
"\terror\n"
20 val mkPrintGoto
= fn (printNonterm
,print
) =>
21 let val printInt
= print
o (Int.toString
: int -> string)
22 in fn (nonterm
,STATE i
) =>
30 val mkPrintTermAction
= fn (printTerm
,print
) =>
31 let val printAction
= mkPrintAction print
32 in fn (term
,action
) =>
37 val mkPrintGoto
= fn (printNonterm
,print
) =>
38 fn (nonterm
,STATE i
) =>
39 let val printInt
= print
o (Int.toString
: int -> string)
46 val mkPrintError
= fn (printTerm
,printRule
,print
) =>
47 let val printInt
= print
o (Int.toString
: int -> string)
48 val printState
= fn STATE s
=> (print
" state "; printInt s
)
49 in fn (RR (term
,state
,r1
,r2
)) =>
52 print
": reduce/reduce conflict between rule ";
59 |
(SR (term
,state
,r1
)) =>
62 print
": shift/reduce conflict ";
65 print
", reduce by rule ";
69 (print
"warning: rule <";
71 print
"> will never be reduced\n")
73 (print
"warning: start symbol appears on the rhs of ";
78 (print
"warning: non-shiftable terminal ";
80 print
"appears on the rhs of ";
85 structure PairList
: sig
86 val app
: ('a
* 'b
-> unit
) -> ('a
,'b
) pairlist
-> unit
87 val length
: ('a
,'b
) pairlist
-> int
93 |
g (PAIR(a
,b
,r
)) = (f(a
,b
); g r
)
97 let fun g(EMPTY
,len
) = len
98 |
g(PAIR(_
,_
,r
),len
) = g(r
,len
+1)
103 fn {termToString
,nontermToString
,table
,stateErrs
,entries
:int,
104 print
,printRule
,errs
,printCores
} =>
106 val printTerm
= print
o termToString
107 val printNonterm
= print
o nontermToString
109 val printCore
= printCores print
110 val printTermAction
= mkPrintTermAction(printTerm
,print
)
111 val printAction
= mkPrintAction print
112 val printGoto
= mkPrintGoto(printNonterm
,print
)
113 val printError
= mkPrintError(printTerm
,printRule print
,print
)
115 val gotos
= LrTable
.describeGoto table
116 val actions
= LrTable
.describeActions table
117 val states
= numStates table
119 val gotoTableSize
= ref
0
120 val actionTableSize
= ref
0
122 val _
= if length errs
> 0
123 then (printSummary print errs
;
129 else let val s
= STATE i
130 in (app
printError (stateErrs s
);
133 let val (actionList
,default
) = actions s
134 val gotoList
= gotos s
135 in (PairList
.app printTermAction actionList
;
137 PairList
.app printGoto gotoList
;
142 gotoTableSize
:=(!gotoTableSize
)+
143 PairList
.length gotoList
;
144 actionTableSize
:= (!actionTableSize
) +
145 PairList
.length actionList
+ 1
151 print (Int.toString entries ^
" of " ^
152 Int.toString (!actionTableSize
)^
153 " action table entries left after compaction\n");
154 print (Int.toString (!gotoTableSize
)^
" goto table entries\n")