public static IDictionary<int, Interval> GetStateToGrammarRegionMap(GrammarRootAST ast, IntervalSet grammarTokenTypes)
{
IDictionary<int, Interval> stateToGrammarRegionMap = new Dictionary<int, Interval>();
if (ast == null)
return stateToGrammarRegionMap;
IList<GrammarAST> nodes = ast.GetNodesWithType(grammarTokenTypes);
foreach (GrammarAST n in nodes)
{
if (n.atnState != null)
{
Interval tokenRegion = Interval.Of(n.TokenStartIndex, n.TokenStopIndex);
Antlr.Runtime.Tree.ITree ruleNode = null;
// RULEs, BLOCKs of transformed recursive rules point to original token interval
switch (n.Type)
{
case ANTLRParser.RULE:
ruleNode = n;
break;
case ANTLRParser.BLOCK:
case ANTLRParser.CLOSURE:
ruleNode = n.GetAncestor(ANTLRParser.RULE);
break;
}
if (ruleNode is RuleAST)
{
string ruleName = ((RuleAST)ruleNode).GetRuleName();
Rule r = ast.g.GetRule(ruleName);
if (r is LeftRecursiveRule)
{
RuleAST originalAST = ((LeftRecursiveRule)r).GetOriginalAST();
tokenRegion = Interval.Of(originalAST.TokenStartIndex, originalAST.TokenStopIndex);
}
}
stateToGrammarRegionMap[n.atnState.stateNumber] = tokenRegion;
}
}
return stateToGrammarRegionMap;
}