functor (T : sig type 'a terminal type 'a nonterminal end) -> sig type 'a symbol = T : 'a T.terminal -> 'a symbol | N : 'a T.nonterminal -> 'a symbol type xsymbol = X : 'a symbol -> xsymbol end