protected virtual void IssueRecursionWarnings()
{
// RECURSION OVERFLOW
ICollection<int> dfaStatesWithRecursionProblems =
_stateToRecursionOverflowConfigurationsMap.Keys;
// now walk truly unique (unaliased) list of dfa states with inf recur
// Goal: create a map from alt to map<target,IList<callsites>>
// Map<Map<String target, IList<NFAState call sites>>
IDictionary<int, IDictionary<string, ICollection<NFAState>>> altToTargetToCallSitesMap =
new Dictionary<int, IDictionary<string, ICollection<NFAState>>>();
// track a single problem DFA state for each alt
var altToDFAState = new Dictionary<int, DFAState>();
ComputeAltToProblemMaps( dfaStatesWithRecursionProblems,
_stateToRecursionOverflowConfigurationsMap,
altToTargetToCallSitesMap, // output param
altToDFAState ); // output param
// walk each alt with recursion overflow problems and generate error
ICollection<int> alts = altToTargetToCallSitesMap.Keys;
List<int> sortedAlts = new List<int>( alts );
sortedAlts.Sort();
//Collections.sort( sortedAlts );
foreach ( int altI in sortedAlts )
{
IDictionary<string, ICollection<NFAState>> targetToCallSiteMap;
altToTargetToCallSitesMap.TryGetValue(altI, out targetToCallSiteMap);
var targetRules = targetToCallSiteMap.Keys;
var callSiteStates = targetToCallSiteMap.Values;
DFAState sampleBadState;
altToDFAState.TryGetValue(altI, out sampleBadState);
ErrorManager.RecursionOverflow( this,
sampleBadState,
altI,
targetRules,
callSiteStates );
}
}