readStates method
void
readStates(
- ATN atn
)
Implementation
void readStates(ATN atn) {
final loopBackStateNumbers = <Pair<LoopEndState, int>>[];
final endStateNumbers = <Pair<BlockStartState, int>>[];
final nstates = readInt();
for (var i = 0; i < nstates; i++) {
final stype = StateType.values[readInt()];
// ignore bad type of states
if (stype == StateType.INVALID_TYPE) {
atn.addState(null);
continue;
}
var ruleIndex = readInt();
final s = stateFactory(stype, ruleIndex);
if (s is LoopEndState) {
// special case
final loopBackStateNumber = readInt();
loopBackStateNumbers.add(Pair(s, loopBackStateNumber));
} else if (s is BlockStartState) {
final endStateNumber = readInt();
endStateNumbers.add(Pair(s, endStateNumber));
}
atn.addState(s);
}
// delay the assignment of loop back and end states until we know all the state instances have been initialized
for (final pair in loopBackStateNumbers) {
pair.a.loopBackState = atn.states[pair.b];
}
for (final pair in endStateNumbers) {
pair.a.endState = atn.states[pair.b] as BlockEndState;
}
final numNonGreedyStates = readInt();
for (var i = 0; i < numNonGreedyStates; i++) {
final stateNumber = readInt();
(atn.states[stateNumber] as DecisionState).nonGreedy = true;
}
final numPrecedenceStates = readInt();
for (var i = 0; i < numPrecedenceStates; i++) {
final stateNumber = readInt();
(atn.states[stateNumber] as RuleStartState).isLeftRecursiveRule = true;
}
}