readStates method

void readStates(
  1. 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;
  }
}