def _max_expansion_coverage(self, symbol, max_depth): if max_depth <= 0: return set() self._symbols_seen.add(symbol) expansions = set() for expansion in self.grammar[symbol]: expansions.add(expansion_key(symbol, expansion)) for nonterminal in nonterminals(expansion): if nonterminal not in self._symbols_seen: expansions |= self._max_expansion_coverage( nonterminal, max_depth - 1) return expansions
def _max_symbol_expansion_coverage( self, symbol, max_depth, cov, symbols_seen): """Return set of all expansions in a grammar starting with `symbol`""" if max_depth <= 0: return (cov, symbols_seen) symbols_seen.add(symbol) for expansion in self.grammar[symbol]: key = self.expansion_key(symbol, expansion) if key in cov: continue cov.add(key) for s in nonterminals(expansion): if s in symbols_seen: continue new_cov, new_symbols_seen = ( self._max_symbol_expansion_coverage(s, max_depth - 1, cov, symbols_seen)) cov |= new_cov symbols_seen |= new_symbols_seen return (cov, symbols_seen)