readEdges method

void readEdges(
  1. ATN atn,
  2. dynamic sets
)

Implementation

void readEdges(ATN atn, sets) {
  final nedges = readInt();
  for (var i = 0; i < nedges; i++) {
    final src = readInt();
    final trg = readInt();
    final ttype = TransitionType.values[readInt()];
    final arg1 = readInt();
    final arg2 = readInt();
    final arg3 = readInt();
    final trans = edgeFactory(atn, ttype, src, trg, arg1, arg2, arg3, sets);
//			System.out.println("EDGE "+trans.getClass().getSimpleName()+" "+
//							   src+"->"+trg+
//					   " "+Transition.serializationNames[ttype]+
//					   " "+arg1+","+arg2+","+arg3);
    final srcState = atn.states[src]!;
    srcState.addTransition(trans);
  }

  // edges for rule stop states can be derived, so they aren't serialized
  for (var state in atn.states) {
    if (state == null) {
      continue;
    }
    for (var i = 0; i < state.numberOfTransitions; i++) {
      final t = state.transition(i);
      if (t is RuleTransition) {
        final ruleTransition = t;
        var outermostPrecedenceReturn = -1;
        if (atn.ruleToStartState[ruleTransition.target.ruleIndex]
            .isLeftRecursiveRule) {
          if (ruleTransition.precedence == 0) {
            outermostPrecedenceReturn = ruleTransition.target.ruleIndex;
          }
        }

        final returnTransition = EpsilonTransition(
            ruleTransition.followState, outermostPrecedenceReturn);
        atn.ruleToStopState[ruleTransition.target.ruleIndex]
            .addTransition(returnTransition);
      }
    }
  }

  for (var state in atn.states) {
    if (state is BlockStartState) {
      // we need to know the end state to set its start state
      if (state.endState == null) {
        throw StateError('');
      }

      // block end states can only be associated to a single block start state
      if (state.endState!.startState != null) {
        throw StateError('');
      }

      state.endState!.startState = state;
    }

    if (state is PlusLoopbackState) {
      final loopbackState = state;
      for (var i = 0; i < loopbackState.numberOfTransitions; i++) {
        final target = loopbackState.transition(i).target;
        if (target is PlusBlockStartState) {
          target.loopBackState = loopbackState;
        }
      }
    } else if (state is StarLoopbackState) {
      final loopbackState = state;
      for (var i = 0; i < loopbackState.numberOfTransitions; i++) {
        final target = loopbackState.transition(i).target;
        if (target is StarLoopEntryState) {
          target.loopBackState = loopbackState;
        }
      }
    }
  }
}