Пример #1
0
 def is_parseable(self, with_manipulation=False):
     pdg = DirectedGraph() #parse decision graph
     for rule in self.rules:
         a,b = rule.head, rule.tail[0]
         pdg.add_vertex(a)
         pdg.add_vertex(b)
         pdg.add_edge(a,b)
     if not with_manipulation:
         if pdg.is_cyclic():
             return False
     for leaf in pdg.leaves():
         if not leaf.is_terminal():
             return False
     return True
Пример #2
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)