private boolean processProduction(Production production, Grammar grammar,
                FirstSets firstSets) {
            if (production.isEpsilonMove()) {
                return false;
            }
            boolean result = false;
            int index = 0;
            for (final Symbol symbol : production.getRight()) {
                final Set<Symbol> follow = sets.get(symbol);
                final Set<Symbol> first = firstSets.getFirstSet(
                        production.getRight(), index + 1);
                if ((first.remove(grammar.getEpsilon())
                        || (index == production.getRight().size() - 1))
                            && follow.addAll(sets.get(production.getLeft()))) {
                        result = true;
                }
                if (follow.addAll(first)) {
                    result = true;
                }
                index++;
            }
            return result;
        }