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