private static <T> Expression<T>
	rebuild(final Expression<T> expression, final Collection<Symbol<T>> symbols) {
		return new Expression<>(
			expression.symbols.stream()
				.map(s -> select(s, symbols))
				.toList()
		);
	}
Create a grammar object with the given rules.

@param rules the rules the grammar consists of
@throws IllegalArgumentException if the list of rules is empty or there
        are duplicate rules
@throws NullPointerException if the list of rules is {@code null}
jenetics.ext/src/main/java/io/jenetics/ext/grammar/Cfg.java