示例#1
0
        public virtual Handle Action([NotNull] ActionAST action)
        {
            //System.out.println("action: "+action);
            ATNState left = NewState(action);

            ATNState         right = NewState(action);
            ActionTransition a     = new ActionTransition(right, currentRule.index);

            left.AddTransition(a);
            action.atnState = left;
            return(new Handle(left, right));
        }
示例#2
0
        protected virtual Handle Action(GrammarAST node, ILexerAction lexerAction)
        {
            ATNState         left             = NewState(node);
            ATNState         right            = NewState(node);
            bool             isCtxDependent   = false;
            int              lexerActionIndex = GetLexerActionIndex(lexerAction);
            ActionTransition a =
                new ActionTransition(right, currentRule.index, lexerActionIndex, isCtxDependent);

            left.AddTransition(a);
            node.atnState = left;
            Handle h = new Handle(left, right);

            return(h);
        }
示例#3
0
        protected internal virtual void VisitState(ATNState p)
        {
            int edge;

            if (p.NumberOfTransitions > 1)
            {
                ErrorHandler.Sync(this);
                edge = Interpreter.AdaptivePredict(TokenStream, ((DecisionState)p).decision, RuleContext);
            }
            else
            {
                edge = 1;
            }
            Transition transition = p.Transition(edge - 1);

            switch (transition.TransitionType)
            {
            case TransitionType.Epsilon:
            {
                if (pushRecursionContextStates.Get(p.stateNumber) && !(transition.target is LoopEndState))
                {
                    InterpreterRuleContext ctx = new InterpreterRuleContext(_parentContextStack.Peek().Item1, _parentContextStack.Peek().Item2, RuleContext.RuleIndex);
                    PushNewRecursionContext(ctx, _atn.ruleToStartState[p.ruleIndex].stateNumber, RuleContext.RuleIndex);
                }
                break;
            }

            case TransitionType.Atom:
            {
                Match(((AtomTransition)transition).token);
                break;
            }

            case TransitionType.Range:
            case TransitionType.Set:
            case TransitionType.NotSet:
            {
                if (!transition.Matches(TokenStream.La(1), TokenConstants.MinUserTokenType, 65535))
                {
                    ErrorHandler.RecoverInline(this);
                }
                MatchWildcard();
                break;
            }

            case TransitionType.Wildcard:
            {
                MatchWildcard();
                break;
            }

            case TransitionType.Rule:
            {
                RuleStartState         ruleStartState = (RuleStartState)transition.target;
                int                    ruleIndex      = ruleStartState.ruleIndex;
                InterpreterRuleContext ctx_1          = new InterpreterRuleContext(RuleContext, p.stateNumber, ruleIndex);
                if (ruleStartState.isPrecedenceRule)
                {
                    EnterRecursionRule(ctx_1, ruleStartState.stateNumber, ruleIndex, ((RuleTransition)transition).precedence);
                }
                else
                {
                    EnterRule(ctx_1, transition.target.stateNumber, ruleIndex);
                }
                break;
            }

            case TransitionType.Predicate:
            {
                PredicateTransition predicateTransition = (PredicateTransition)transition;
                if (!Sempred(RuleContext, predicateTransition.ruleIndex, predicateTransition.predIndex))
                {
                    throw new FailedPredicateException(this);
                }
                break;
            }

            case TransitionType.Action:
            {
                ActionTransition actionTransition = (ActionTransition)transition;
                Action(RuleContext, actionTransition.ruleIndex, actionTransition.actionIndex);
                break;
            }

            case TransitionType.Precedence:
            {
                if (!Precpred(RuleContext, ((PrecedencePredicateTransition)transition).precedence))
                {
                    throw new FailedPredicateException(this, string.Format("precpred(_ctx, {0})", ((PrecedencePredicateTransition)transition).precedence));
                }
                break;
            }

            default:
            {
                throw new NotSupportedException("Unrecognized ATN transition type.");
            }
            }
            State = transition.target.stateNumber;
        }
示例#4
0
        protected internal virtual void VisitState(ATNState p)
        {
            int predictedAlt = 1;

            if (p.NumberOfTransitions > 1)
            {
                predictedAlt = VisitDecisionState((DecisionState)p);
            }
            Transition transition = p.Transition(predictedAlt - 1);

            switch (transition.TransitionType)
            {
            case TransitionType.Epsilon:
            {
                if (pushRecursionContextStates.Get(p.stateNumber) && !(transition.target is LoopEndState))
                {
                    // We are at the start of a left recursive rule's (...)* loop
                    // and we're not taking the exit branch of loop.
                    InterpreterRuleContext localctx = CreateInterpreterRuleContext(_parentContextStack.Peek().Item1, _parentContextStack.Peek().Item2, _ctx.RuleIndex);
                    PushNewRecursionContext(localctx, atn.ruleToStartState[p.ruleIndex].stateNumber, _ctx.RuleIndex);
                }
                break;
            }

            case TransitionType.Atom:
            {
                Match(((AtomTransition)transition).label);
                break;
            }

            case TransitionType.Range:
            case TransitionType.Set:
            case TransitionType.NotSet:
            {
                if (!transition.Matches(_input.La(1), TokenConstants.MinUserTokenType, 65535))
                {
                    RecoverInline();
                }
                MatchWildcard();
                break;
            }

            case TransitionType.Wildcard:
            {
                MatchWildcard();
                break;
            }

            case TransitionType.Rule:
            {
                RuleStartState         ruleStartState = (RuleStartState)transition.target;
                int                    ruleIndex      = ruleStartState.ruleIndex;
                InterpreterRuleContext newctx         = CreateInterpreterRuleContext(_ctx, p.stateNumber, ruleIndex);
                if (ruleStartState.isPrecedenceRule)
                {
                    EnterRecursionRule(newctx, ruleStartState.stateNumber, ruleIndex, ((RuleTransition)transition).precedence);
                }
                else
                {
                    EnterRule(newctx, transition.target.stateNumber, ruleIndex);
                }
                break;
            }

            case TransitionType.Predicate:
            {
                PredicateTransition predicateTransition = (PredicateTransition)transition;
                if (!Sempred(_ctx, predicateTransition.ruleIndex, predicateTransition.predIndex))
                {
                    throw new FailedPredicateException(this);
                }
                break;
            }

            case TransitionType.Action:
            {
                ActionTransition actionTransition = (ActionTransition)transition;
                Action(_ctx, actionTransition.ruleIndex, actionTransition.actionIndex);
                break;
            }

            case TransitionType.Precedence:
            {
                if (!Precpred(_ctx, ((PrecedencePredicateTransition)transition).precedence))
                {
                    throw new FailedPredicateException(this, string.Format("precpred(_ctx, {0})", ((PrecedencePredicateTransition)transition).precedence));
                }
                break;
            }

            default:
            {
                throw new NotSupportedException("Unrecognized ATN transition type.");
            }
            }
            State = transition.target.stateNumber;
        }
示例#5
0
        public virtual string AsString()
        {
            if (start == null)
            {
                return(null);
            }
            marked = new HashSet <ATNState>();

            work = new List <ATNState>();
            work.Add(start);

            StringBuilder buf = new StringBuilder();
            ATNState      s;

            while (work.Count > 0)
            {
                s = work[0];
                work.RemoveAt(0);
                if (marked.Contains(s))
                {
                    continue;
                }
                int n = s.NumberOfTransitions;
                //System.Console.WriteLine("visit " + s + "; edges=" + n);
                marked.Add(s);
                for (int i = 0; i < n; i++)
                {
                    Transition t = s.Transition(i);
                    if (!(s is RuleStopState))
                    { // don't add follow states to work
                        if (t is RuleTransition)
                        {
                            work.Add(((RuleTransition)t).followState);
                        }
                        else
                        {
                            work.Add(t.target);
                        }
                    }
                    buf.Append(GetStateString(s));
                    if (t is EpsilonTransition)
                    {
                        buf.Append("->").Append(GetStateString(t.target)).Append('\n');
                    }
                    else if (t is RuleTransition)
                    {
                        buf.Append("-").Append(g.GetRule(((RuleTransition)t).ruleIndex).name).Append("->").Append(GetStateString(t.target)).Append('\n');
                    }
                    else if (t is ActionTransition)
                    {
                        ActionTransition a = (ActionTransition)t;
                        buf.Append("-").Append(a.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
                    }
                    else if (t is SetTransition)
                    {
                        SetTransition st  = (SetTransition)t;
                        bool          not = st is NotSetTransition;
                        if (g.IsLexer())
                        {
                            buf.Append("-").Append(not ? "~" : "").Append(st.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
                        }
                        else
                        {
                            buf.Append("-").Append(not ? "~" : "").Append(st.Label.ToString(g.GetVocabulary())).Append("->").Append(GetStateString(t.target)).Append('\n');
                        }
                    }
                    else if (t is AtomTransition)
                    {
                        AtomTransition a     = (AtomTransition)t;
                        string         label = g.GetTokenDisplayName(a.label);
                        buf.Append("-").Append(label).Append("->").Append(GetStateString(t.target)).Append('\n');
                    }
                    else
                    {
                        buf.Append("-").Append(t.ToString()).Append("->").Append(GetStateString(t.target)).Append('\n');
                    }
                }
            }
            return(buf.ToString());
        }