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)); }
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); }
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; }
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; }
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()); }