Alla fine ho risolto da solo usando le classi EnumSet ed Enum:

codice:
import java.util.EnumSet;

public class Test {
	public static void main(String[] args) {
		Grammar g = new Grammar(EnumSet.allOf(Term.class), EnumSet.allOf(NonTerm.class), NonTerm.E,
				new Production[]{
			new Production(NonTerm.E, NonTerm.T, NonTerm.E_),
			new Production(NonTerm.E_, Term.PLUS, NonTerm.T, NonTerm.E_),
			new Production(NonTerm.E_, Term.EPS),
			new Production(NonTerm.T, Term.NUM)
			});
		System.out.println(g);
	}
}
Il cui output è:

codice:
GRAMMAR = {
	TERMINAL_SYMBOLS = [NUM, EPS, PLUS]
	NON-TERMINAL_SYMBOLS = [E, E_, T]
	START_SYMBOL = E
	PRODUCTIONS = [E -> [T, E_], E_ -> [PLUS, T, E_], E_ -> [EPS], T -> [NUM]]
}