Beispiel #1
0
 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)