private void ComputeAltToProblemMaps( IEnumerable<int> dfaStatesUnaliased,
IDictionary<int,IList<NFAConfiguration>> configurationsMap,
IDictionary<int,IDictionary<string,ICollection<NFAState>>> altToTargetToCallSitesMap,
IDictionary<int, DFAState> altToDFAState )
{
foreach ( int stateI in dfaStatesUnaliased )
{
// walk this DFA's config list
IList<NFAConfiguration> configs;
configurationsMap.TryGetValue(stateI, out configs);
for ( int i = 0; i < configs.Count; i++ )
{
NFAConfiguration c = (NFAConfiguration)configs[i];
NFAState ruleInvocationState = _dfa.Nfa.GetState( c.State );
Transition transition0 = ruleInvocationState.transition[0];
RuleClosureTransition @ref = (RuleClosureTransition)transition0;
string targetRule = ( (NFAState)@ref.Target ).enclosingRule.Name;
int altI = c.Alt;
IDictionary<string, ICollection<NFAState>> targetToCallSiteMap;
altToTargetToCallSitesMap.TryGetValue(altI, out targetToCallSiteMap);
if ( targetToCallSiteMap == null )
{
targetToCallSiteMap = new Dictionary<string, ICollection<NFAState>>();
altToTargetToCallSitesMap[altI] = targetToCallSiteMap;
}
ICollection<NFAState> callSites;
targetToCallSiteMap.TryGetValue(targetRule, out callSites);
if ( callSites == null )
{
callSites = new HashSet<NFAState>();
targetToCallSiteMap[targetRule] = callSites;
}
callSites.Add( ruleInvocationState );
// track one problem DFA state per alt
DFAState state;
if ( !altToDFAState.TryGetValue( altI, out state ) || state == null )
{
DFAState sampleBadState = _dfa.GetState( stateI );
altToDFAState[altI] = sampleBadState;
}
}
}
}