1 (* ML
-Yacc Parser
Generator (c
) 1989 Andrew W
. Appel
, David R
. Tarditi
*)
3 structure Grammar
: GRAMMAR
=
6 (* define types term
and nonterm using those
in LrTable
7 datatype term
= T
of int
8 datatype nonterm
= NT
of int *)
11 datatype symbol
= TERM
of term | NONTERM
of nonterm
12 datatype grammar
= GRAMMAR
of
13 {rules
: {lhs
: nonterm
,
15 precedence
: int option
,
22 precedence
: term
-> int option
,
23 termToString
: term
-> string,
24 nontermToString
: nonterm
-> string}
27 structure IntGrammar
: INTGRAMMAR
=
29 structure Grammar
= Grammar
32 datatype rule
= RULE
of
35 num
: int,(* internal # assigned by coreutils
*)
37 precedence
: int option
}
39 val eqTerm
: term
* term
-> bool = (op =)
40 val gtTerm
: term
* term
-> bool = fn (T i
,T j
) => i
>j
42 val eqNonterm
: nonterm
* nonterm
-> bool = (op =)
43 val gtNonterm
: nonterm
* nonterm
-> bool =
46 val eqSymbol
: symbol
* symbol
-> bool = (op =)
47 val gtSymbol
= fn (TERM (T i
),TERM (T j
)) => i
>j
48 |
(NONTERM (NT i
),NONTERM (NT j
)) => i
>j
49 |
(TERM _
,NONTERM _
) => false
50 |
(NONTERM _
,TERM _
) => true
53 structure SymbolAssoc
= Table(type key
= symbol
56 structure NontermAssoc
= Table(type key
= nonterm
61 val prRule
= fn (a
as symbolToString
,nontermToString
,print
) =>
62 let val printSymbol
= print
o symbolToString
63 fun printRhs (h
::t
) = (printSymbol h
; print
" ";
66 in fn (RULE
{lhs
,rhs
,num
,rulenum
,precedence
,...}) =>
67 ((print
o nontermToString
) lhs
; print
" : ";
69 if DEBUG
then (print
" num = ";
70 print (Int.toString num
);
72 print (Int.toString rulenum
);
73 print
" precedence = ";
75 of NONE
=> print
" none"
77 print (Int.toString i
);
83 fn (a
as (symbolToString
,nontermToString
,print
)) =>
84 fn (GRAMMAR
{rules
,terms
,nonterms
,start
,...}) =>
86 let val prRule
= prRule a
87 in fn {lhs
,rhs
,precedence
,rulenum
} =>
88 (prRule (RULE
{lhs
=lhs
,rhs
=rhs
,num
=0,
89 rulenum
=rulenum
, precedence
=precedence
});
92 in print
"grammar = \n";
93 List.app printRule rules
;
95 print (" terms = " ^
(Int.toString terms
) ^
96 " nonterms = " ^
(Int.toString nonterms
) ^
98 (print
o nontermToString
) start
;