private void BuildLookups() {
_reverseTerminalProductions = Cache.Create(() => Helpers.BuildLookup(
() => _terminalProductions,
(p) => (Terminal)p.Rhs[0],
(p) => p,
() => (ICollection<Production>)new HashSet<Production>(),
(x, y) => x.Add(y)
));
this.Caches.Add(_reverseTerminalProductions);
_ntProductionsByNonterminal = Cache.Create(() => Helpers.BuildLookup(
() => _nonterminalProductions,
(p) => p.Lhs,
(p) => p,
() => (ICollection<Production>)new HashSet<Production>(),
(x, y) => x.Add(y)
));
this.Caches.Add(_ntProductionsByNonterminal);
_tProductionsByNonterminal = Cache.Create(() => Helpers.BuildLookup(
() => _terminalProductions,
(p) => p.Lhs,
(p) => p,
() => (ICollection<Production>)new HashSet<Production>(),
(x, y) => x.Add(y)
));
this.Caches.Add(_tProductionsByNonterminal);
_productionsFrom = Cache.Create(() => Helpers.BuildLookup(
() => _terminalProductions.Concat(_nonterminalProductions).Concat(_emptyProductions),
(p) => p.Lhs,
(p) => p,
() => (ICollection<Production>)new HashSet<Production>(),
(x, y) => x.Add(y)
));
this.Caches.Add(_productionsFrom);
}