private void StepUnit(ISet<Production> productions) {
// TODO: maybe we shouldn't allow self loops?
RemoveSelfLoops(productions);
var toRemove = BaseGrammar.RemoveDuplicatesHelper(productions);
foreach (var production in toRemove) {
productions.Remove(production);
}
var finalProductions = RemoveUnits(productions);
productions.Clear();
productions.UnionWith(finalProductions);
}