/** Check all rules for infinite left recursion before analysis. Return list
* of troublesome rule cycles. This method has two side-effects: it notifies
* the error manager that we have problems and it sets the list of
* recursive rules that we should ignore during analysis.
*/
public virtual IList <HashSet <Rule> > CheckAllRulesForLeftRecursion()
{
grammar.BuildNFA(); // make sure we have NFAs
grammar.leftRecursiveRules = new HashSet <Rule>();
List <HashSet <Rule> > listOfRecursiveCycles = new List <HashSet <Rule> >();
for (int i = 0; i < grammar.composite.RuleIndexToRuleList.Count; i++)
{
Rule r = grammar.composite.RuleIndexToRuleList[i];
if (r != null)
{
visitedDuringRecursionCheck = new HashSet <Rule>();
visitedDuringRecursionCheck.Add(r);
HashSet <object> visitedStates = new HashSet <object>();
TraceStatesLookingForLeftRecursion(r.StartState,
visitedStates,
listOfRecursiveCycles);
}
}
if (listOfRecursiveCycles.Count > 0)
{
ErrorManager.LeftRecursionCycles(listOfRecursiveCycles);
}
return(listOfRecursiveCycles);
}