public override ATN CreateATN()
{
// BUILD ALL START STATES (ONE PER MODE)
ICollection<string> modes = ((LexerGrammar)g).modes.Keys;
foreach (string modeName in modes)
{
// create s0, start state; implied Tokens rule node
TokensStartState startState = NewState<TokensStartState>(null);
atn.DefineMode(modeName, startState);
}
// INIT ACTION, RULE->TOKEN_TYPE MAP
atn.ruleToTokenType = new int[g.rules.Count];
foreach (Rule r in g.rules.Values)
{
atn.ruleToTokenType[r.index] = g.GetTokenType(r.name);
}
// CREATE ATN FOR EACH RULE
_CreateATN(g.rules.Values);
atn.lexerActions = new ILexerAction[indexToActionMap.Count];
foreach (KeyValuePair<int, ILexerAction> entry in indexToActionMap)
{
atn.lexerActions[entry.Key] = entry.Value;
}
// LINK MODE START STATE TO EACH TOKEN RULE
foreach (string modeName in modes)
{
IList<Rule> rules = ((LexerGrammar)g).modes[modeName];
TokensStartState startState = atn.modeNameToStartState[modeName];
foreach (Rule r in rules)
{
if (!r.IsFragment())
{
RuleStartState s = atn.ruleToStartState[r.index];
Epsilon(startState, s);
}
}
}
ATNOptimizer.Optimize(g, atn);
return atn;
}