getEpsilonTarget method

ATNConfig? getEpsilonTarget(
  1. ATNConfig config,
  2. Transition t,
  3. bool collectPredicates,
  4. bool inContext,
  5. bool fullCtx,
  6. bool treatEofAsEpsilon,
)

Implementation

ATNConfig? getEpsilonTarget(
    ATNConfig config,
    Transition t,
    bool collectPredicates,
    bool inContext,
    bool fullCtx,
    bool treatEofAsEpsilon) {
  switch (t.type) {
    case TransitionType.RULE:
      return ruleTransition(config, t as RuleTransition);

    case TransitionType.PRECEDENCE:
      return precedenceTransition(
        config,
        t as PrecedencePredicateTransition,
        collectPredicates,
        inContext,
        fullCtx,
      );

    case TransitionType.PREDICATE:
      return predTransition(
        config,
        t as PredicateTransition,
        collectPredicates,
        inContext,
        fullCtx,
      );
    case TransitionType.ACTION:
      return actionTransition(config, t as ActionTransition);

    case TransitionType.EPSILON:
      return ATNConfig.dup(config, state: t.target);

    case TransitionType.ATOM:
    case TransitionType.RANGE:
    case TransitionType.SET:
      // EOF transitions act like epsilon transitions after the first EOF
      // transition is traversed
      if (treatEofAsEpsilon) {
        if (t.matches(Token.EOF, 0, 1)) {
          return ATNConfig.dup(config, state: t.target);
        }
      }

      return null;

    default:
      return null;
  }
}