def try_removing_useless_rules(self): gen_graph = DirectedGraph() for rule in self.rules: for symbol in rule.unique_symbols(): if not symbol.is_terminal(): gen_graph.add_vertex(symbol) for symbol in rule.tail: if not symbol.is_terminal(): gen_graph.add_edge(rule.head, symbol) removed = [] for s in gen_graph.get_unreachable(self.start): to_del = self.rules_by_head(s) for rule in to_del: i = self.index(rule) removed.append(i) if removed: self.__assert_parent__() removed.sort() for i in reversed(removed): del self.rules[i] self.__commit_transform__(Unremove(removed)) return len(removed)