Пример #1
0
        public virtual void trackNFAStatesThatHaveLabeledEdge(Label label, NFAState stateWithLabeledEdge)
        {
            HashSet <NFAState> states = typeToNFAStatesWithEdgeOfTypeMap.get(label);

            if (states == null)
            {
                states = new HashSet <NFAState>();
                typeToNFAStatesWithEdgeOfTypeMap[label] = states;
            }
            states.Add(stateWithLabeledEdge);
        }
Пример #2
0
        public override String ToString()
        {
            GrammarAST decisionASTNode = probe.Dfa.DecisionASTNode;

            line = decisionASTNode.Line;
            charPositionInLine = decisionASTNode.CharPositionInLine;
            String fileName = probe.Dfa.Nfa.Grammar.FileName;

            if (fileName != null)
            {
                file = fileName;
            }

            StringTemplate st = GetMessageTemplate();

            if (probe.Dfa.IsTokensRuleDecision)
            {
                // alts are token rules, convert to the names instead of numbers
                for (int i = 0; i < alts.Length; i++)
                {
                    int    altI      = alts[i];
                    String tokenName = probe.GetTokenNameForTokensRuleAlt(altI);
                    // reset the line/col to the token definition
                    NFAState ruleStart = probe.Dfa.Nfa.Grammar.GetRuleStartState(tokenName);
                    line = ruleStart.associatedASTNode.Line;
                    charPositionInLine = ruleStart.associatedASTNode.CharPositionInLine;
                    st.SetAttribute("tokens", tokenName);
                }
            }
            else
            {
                // regular alt numbers, show the alts
                st.SetAttribute("alts", alts);
            }

            return(base.ToString(st));
        }
Пример #3
0
 public virtual void trackNFAStatesThatHaveLabeledEdge( Label label, NFAState stateWithLabeledEdge )
 {
     HashSet<NFAState> states = typeToNFAStatesWithEdgeOfTypeMap.get( label );
     if ( states == null )
     {
         states = new HashSet<NFAState>();
         typeToNFAStatesWithEdgeOfTypeMap[label] = states;
     }
     states.Add( stateWithLabeledEdge );
 }
Пример #4
0
 public virtual void AddState( NFAState state )
 {
     numberToStateList.Resize( state.StateNumber + 1 ); // make sure we have room
     numberToStateList[state.StateNumber] = state;
 }
Пример #5
0
 public virtual void AddState(NFAState state)
 {
     numberToStateList.setSize(state.stateNumber + 1);   // make sure we have room
     numberToStateList[state.stateNumber] = state;
 }
Пример #6
0
        public override string ToString()
        {
            GrammarAST decisionASTNode = probe.dfa.DecisionASTNode;

            line = decisionASTNode.Line;
            charPositionInLine = decisionASTNode.CharPositionInLine;
            string fileName = probe.dfa.nfa.grammar.FileName;

            if (fileName != null)
            {
                file = fileName;
            }

            StringTemplate st = GetMessageTemplate();
            // Now fill template with information about problemState
            var    labels = probe.GetSampleNonDeterministicInputSequence(problemState);
            string input  = probe.GetInputSequenceDisplay(labels);

            st.SetAttribute("input", input);

            if (probe.dfa.IsTokensRuleDecision)
            {
                var disabledAlts = probe.GetDisabledAlternatives(problemState);
                foreach (int altI in disabledAlts)
                {
                    string tokenName =
                        probe.GetTokenNameForTokensRuleAlt((int)altI);
                    // reset the line/col to the token definition (pick last one)
                    NFAState ruleStart =
                        probe.dfa.nfa.grammar.GetRuleStartState(tokenName);
                    line = ruleStart.associatedASTNode.Line;
                    charPositionInLine = ruleStart.associatedASTNode.CharPositionInLine;
                    st.SetAttribute("disabled", tokenName);
                }
            }
            else
            {
                st.SetAttribute("disabled", probe.GetDisabledAlternatives(problemState));
            }

            var      nondetAlts = probe.GetNonDeterministicAltsForState(problemState);
            NFAState nfaStart   = probe.dfa.NFADecisionStartState;
            // all state paths have to begin with same NFA state
            int firstAlt = 0;

            if (nondetAlts != null)
            {
                foreach (int displayAltI in nondetAlts)
                {
                    if (DecisionProbe.verbose)
                    {
                        int tracePathAlt =
                            nfaStart.TranslateDisplayAltToWalkAlt((int)displayAltI);
                        if (firstAlt == 0)
                        {
                            firstAlt = tracePathAlt;
                        }
                        IList path =
                            probe.GetNFAPathStatesForAlt(firstAlt,
                                                         tracePathAlt,
                                                         labels);
                        st.SetAttribute("paths.{alt,states}",
                                        displayAltI, path);
                    }
                    else
                    {
                        if (probe.dfa.IsTokensRuleDecision)
                        {
                            // alts are token rules, convert to the names instead of numbers
                            string tokenName =
                                probe.GetTokenNameForTokensRuleAlt((int)displayAltI);
                            st.SetAttribute("conflictingTokens", tokenName);
                        }
                        else
                        {
                            st.SetAttribute("conflictingAlts", displayAltI);
                        }
                    }
                }
            }
            st.SetAttribute("hasPredicateBlockedByAction", problemState.dfa.hasPredicateBlockedByAction);
            return(base.ToString(st));
        }
Пример #7
0
        /** From state s, look for any transition to a rule that is currently
         *  being traced.  When tracing r, visitedDuringRecursionCheck has r
         *  initially.  If you reach an accept state, return but notify the
         *  invoking rule that it is nullable, which implies that invoking
         *  rule must look at follow transition for that invoking state.
         *  The visitedStates tracks visited states within a single rule so
         *  we can avoid epsilon-loop-induced infinite recursion here.  Keep
         *  filling the cycles in listOfRecursiveCycles and also, as a
         *  side-effect, set leftRecursiveRules.
         */
        protected virtual bool TraceStatesLookingForLeftRecursion(NFAState s,
                                                                  HashSet <object> visitedStates,
                                                                  IList <HashSet <Rule> > listOfRecursiveCycles)
        {
            if (s.IsAcceptState)
            {
                // this rule must be nullable!
                // At least one epsilon edge reached accept state
                return(true);
            }
            if (visitedStates.Contains(s))
            {
                // within same rule, we've hit same state; quit looping
                return(false);
            }
            visitedStates.Add(s);
            bool       stateReachesAcceptState = false;
            Transition t0 = s.transition[0];

            if (t0 is RuleClosureTransition)
            {
                RuleClosureTransition refTrans = (RuleClosureTransition)t0;
                Rule refRuleDef = refTrans.Rule;
                //String targetRuleName = ((NFAState)t0.target).getEnclosingRule();
                if (visitedDuringRecursionCheck.Contains(refRuleDef))
                {
                    // record left-recursive rule, but don't go back in
                    grammar.leftRecursiveRules.Add(refRuleDef);
                    //System.Console.Out.WriteLine( "already visited " + refRuleDef + ", calling from " + s.enclosingRule );
                    AddRulesToCycle(refRuleDef,
                                    s.enclosingRule,
                                    listOfRecursiveCycles);
                }
                else
                {
                    // must visit if not already visited; send new visitedStates set
                    visitedDuringRecursionCheck.Add(refRuleDef);
                    bool callReachedAcceptState =
                        TraceStatesLookingForLeftRecursion((NFAState)t0.Target,
                                                           new HashSet <object>(),
                                                           listOfRecursiveCycles);
                    // we're back from visiting that rule
                    visitedDuringRecursionCheck.Remove(refRuleDef);
                    // must keep going in this rule then
                    if (callReachedAcceptState)
                    {
                        NFAState followingState =
                            ((RuleClosureTransition)t0).FollowState;
                        stateReachesAcceptState |=
                            TraceStatesLookingForLeftRecursion(followingState,
                                                               visitedStates,
                                                               listOfRecursiveCycles);
                    }
                }
            }
            else if (t0.Label.IsEpsilon || t0.Label.IsSemanticPredicate)
            {
                stateReachesAcceptState |=
                    TraceStatesLookingForLeftRecursion((NFAState)t0.Target, visitedStates, listOfRecursiveCycles);
            }
            // else it has a labeled edge

            // now do the other transition if it exists
            Transition t1 = s.transition[1];

            if (t1 != null)
            {
                stateReachesAcceptState |=
                    TraceStatesLookingForLeftRecursion((NFAState)t1.Target,
                                                       visitedStates,
                                                       listOfRecursiveCycles);
            }
            return(stateReachesAcceptState);
        }
Пример #8
0
        /** From state s, look for any transition to a rule that is currently
         *  being traced.  When tracing r, visitedDuringRecursionCheck has r
         *  initially.  If you reach an accept state, return but notify the
         *  invoking rule that it is nullable, which implies that invoking
         *  rule must look at follow transition for that invoking state.
         *  The visitedStates tracks visited states within a single rule so
         *  we can avoid epsilon-loop-induced infinite recursion here.  Keep
         *  filling the cycles in listOfRecursiveCycles and also, as a
         *  side-effect, set leftRecursiveRules.
         */
        protected virtual bool TraceStatesLookingForLeftRecursion( NFAState s,
                                                             HashSet<object> visitedStates,
                                                             IList<HashSet<Rule>> listOfRecursiveCycles )
        {
            if ( s.IsAcceptState )
            {
                // this rule must be nullable!
                // At least one epsilon edge reached accept state
                return true;
            }
            if ( visitedStates.Contains( s ) )
            {
                // within same rule, we've hit same state; quit looping
                return false;
            }
            visitedStates.Add( s );
            bool stateReachesAcceptState = false;
            Transition t0 = s.transition[0];
            if ( t0 is RuleClosureTransition )
            {
                RuleClosureTransition refTrans = (RuleClosureTransition)t0;
                Rule refRuleDef = refTrans.rule;
                //String targetRuleName = ((NFAState)t0.target).getEnclosingRule();
                if ( visitedDuringRecursionCheck.Contains( refRuleDef ) )
                {
                    // record left-recursive rule, but don't go back in
                    grammar.leftRecursiveRules.Add( refRuleDef );
                    //System.Console.Out.WriteLine( "already visited " + refRuleDef + ", calling from " + s.enclosingRule );
                    AddRulesToCycle( refRuleDef,
                                    s.enclosingRule,
                                    listOfRecursiveCycles );
                }
                else
                {
                    // must visit if not already visited; send new visitedStates set
                    visitedDuringRecursionCheck.Add( refRuleDef );
                    bool callReachedAcceptState =
                        TraceStatesLookingForLeftRecursion( (NFAState)t0.target,
                                                           new HashSet<object>(),
                                                           listOfRecursiveCycles );
                    // we're back from visiting that rule
                    visitedDuringRecursionCheck.Remove( refRuleDef );
                    // must keep going in this rule then
                    if ( callReachedAcceptState )
                    {
                        NFAState followingState =
                            ( (RuleClosureTransition)t0 ).followState;
                        stateReachesAcceptState |=
                            TraceStatesLookingForLeftRecursion( followingState,
                                                               visitedStates,
                                                               listOfRecursiveCycles );
                    }
                }
            }
            else if ( t0.label.IsEpsilon || t0.label.IsSemanticPredicate )
            {
                stateReachesAcceptState |=
                    TraceStatesLookingForLeftRecursion( (NFAState)t0.target, visitedStates, listOfRecursiveCycles );
            }
            // else it has a labeled edge

            // now do the other transition if it exists
            Transition t1 = s.transition[1];
            if ( t1 != null )
            {
                stateReachesAcceptState |=
                    TraceStatesLookingForLeftRecursion( (NFAState)t1.target,
                                                       visitedStates,
                                                       listOfRecursiveCycles );
            }
            return stateReachesAcceptState;
        }