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
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)