verifyATN method

void verifyATN(
  1. ATN atn
)

Implementation

void verifyATN(ATN atn) {
  // verify assumptions
  for (var state in atn.states) {
    if (state == null) {
      continue;
    }

    checkCondition(
        state.onlyHasEpsilonTransitions() || state.numberOfTransitions <= 1);

    if (state is PlusBlockStartState) {
      checkCondition(state.loopBackState != null);
    }

    if (state is StarLoopEntryState) {
      final starLoopEntryState = state;
      checkCondition(starLoopEntryState.loopBackState != null);
      checkCondition(starLoopEntryState.numberOfTransitions == 2);

      if (starLoopEntryState.transition(0).target is StarBlockStartState) {
        checkCondition(
            starLoopEntryState.transition(1).target is LoopEndState);
        checkCondition(!starLoopEntryState.nonGreedy);
      } else if (starLoopEntryState.transition(0).target is LoopEndState) {
        checkCondition(
            starLoopEntryState.transition(1).target is StarBlockStartState);
        checkCondition(starLoopEntryState.nonGreedy);
      } else {
        throw StateError('');
      }
    }

    if (state is StarLoopbackState) {
      checkCondition(state.numberOfTransitions == 1);
      checkCondition(state.transition(0).target is StarLoopEntryState);
    }

    if (state is LoopEndState) {
      checkCondition(state.loopBackState != null);
    }

    if (state is RuleStartState) {
      checkCondition(state.stopState != null);
    }

    if (state is BlockStartState) {
      checkCondition(state.endState != null);
    }

    if (state is BlockEndState) {
      checkCondition(state.startState != null);
    }

    if (state is DecisionState) {
      final decisionState = state;
      checkCondition(decisionState.numberOfTransitions <= 1 ||
          decisionState.decision >= 0);
    } else {
      checkCondition(
          state.numberOfTransitions <= 1 || state is RuleStopState);
    }
  }
}