Antlr4.Automata.TailEpsilonRemover.VisitState C# (CSharp) Method

VisitState() public method

public VisitState ( [ p ) : void
p [
return void
        public override void VisitState([NotNull] ATNState p)
        {
            if (p.StateType == StateType.Basic && p.NumberOfTransitions == 1)
            {
                ATNState q = p.Transition(0).target;
                if (p.Transition(0) is RuleTransition)
                {
                    q = ((RuleTransition)p.Transition(0)).followState;
                }
                if (q.StateType == StateType.Basic)
                {
                    // we have p-x->q for x in {rule, action, pred, token, ...}
                    // if edge out of q is single epsilon to block end
                    // we can strip epsilon p-x->q-eps->r
                    Transition trans = q.Transition(0);
                    if (q.NumberOfTransitions == 1 && trans is EpsilonTransition)
                    {
                        ATNState r = trans.target;
                        if (r is BlockEndState || r is PlusLoopbackState || r is StarLoopbackState)
                        {
                            // skip over q
                            if (p.Transition(0) is RuleTransition)
                            {
                                ((RuleTransition)p.Transition(0)).followState = r;
                            }
                            else
                            {
                                p.Transition(0).target = r;
                            }
                            _atn.RemoveState(q);
                        }
                    }
                }
            }
        }
    }