예제 #1
0
파일: LL1DFA.cs 프로젝트: ymf1/webgrease
        /** From a set of edgeset->list-of-alts mappings, create a DFA
         *  that uses syn preds for all |list-of-alts|>1.
         */
        public LL1DFA(int decisionNumber,
                      NFAState decisionStartState,
                      MultiMap <IntervalSet, int> edgeMap)
        {
            DFAState s0 = NewState();

            startState                 = s0;
            nfa                        = decisionStartState.nfa;
            NumberOfAlts               = nfa.grammar.GetNumberOfAltsForDecisionNFA(decisionStartState);
            this.decisionNumber        = decisionNumber;
            this.NFADecisionStartState = decisionStartState;
            InitAltRelatedInfo();
            UnreachableAlts = null;
            foreach (var edgeVar in edgeMap)
            {
                IntervalSet edge = edgeVar.Key;
                IList <int> alts = edgeVar.Value;
                alts = alts.OrderBy(i => i).ToList();
                //Collections.sort( alts ); // make sure alts are attempted in order
                //[email protected](edge+" -> "+alts);
                DFAState s = NewState();
                s.LookaheadDepth = 1;
                Label e = GetLabelForSet(edge);
                s0.AddTransition(s, e);
                if (alts.Count == 1)
                {
                    s.acceptState = true;
                    int alt = alts[0];
                    SetAcceptState(alt, s);
                    s.cachedUniquelyPredicatedAlt = alt;
                }
                else
                {
                    // resolve with syntactic predicates.  Add edges from
                    // state s that test predicates.
                    s.IsResolvedWithPredicates = true;
                    for (int i = 0; i < alts.Count; i++)
                    {
                        int alt = (int)alts[i];
                        s.cachedUniquelyPredicatedAlt = NFA.INVALID_ALT_NUMBER;
                        DFAState predDFATarget = GetAcceptState(alt);
                        if (predDFATarget == null)
                        {
                            predDFATarget             = NewState(); // create if not there.
                            predDFATarget.acceptState = true;
                            predDFATarget.cachedUniquelyPredicatedAlt = alt;
                            SetAcceptState(alt, predDFATarget);
                        }
                        // add a transition to pred target from d

                        /*
                         * int walkAlt =
                         *  decisionStartState.translateDisplayAltToWalkAlt(alt);
                         * NFAState altLeftEdge = nfa.grammar.getNFAStateForAltOfDecision(decisionStartState, walkAlt);
                         * NFAState altStartState = (NFAState)altLeftEdge.transition[0].target;
                         * SemanticContext ctx = nfa.grammar.ll1Analyzer.getPredicates(altStartState);
                         * [email protected]("sem ctx = "+ctx);
                         * if ( ctx == null ) {
                         *  ctx = new SemanticContext.TruePredicate();
                         * }
                         * s.addTransition(predDFATarget, new Label(ctx));
                         */
                        SemanticContext.Predicate synpred =
                            GetSynPredForAlt(decisionStartState, alt);
                        if (synpred == null)
                        {
                            synpred = new SemanticContext.TruePredicate();
                        }
                        s.AddTransition(predDFATarget, new PredicateLabel(synpred));
                    }
                }
            }
            //[email protected]("dfa for preds=\n"+this);
        }
예제 #2
0
파일: LL1DFA.cs 프로젝트: bszafko/antlrcs
 /** From a set of edgeset->list-of-alts mappings, create a DFA
  *  that uses syn preds for all |list-of-alts|>1.
  */
 public LL1DFA( int decisionNumber,
               NFAState decisionStartState,
               MultiMap<IntervalSet, int> edgeMap )
 {
     DFAState s0 = NewState();
     startState = s0;
     nfa = decisionStartState.nfa;
     NumberOfAlts = nfa.grammar.GetNumberOfAltsForDecisionNFA( decisionStartState );
     this.decisionNumber = decisionNumber;
     this.NFADecisionStartState = decisionStartState;
     InitAltRelatedInfo();
     UnreachableAlts = null;
     foreach ( var edgeVar in edgeMap )
     {
         IntervalSet edge = edgeVar.Key;
         IList<int> alts = edgeVar.Value;
         alts = alts.OrderBy( i => i ).ToList();
         //Collections.sort( alts ); // make sure alts are attempted in order
         //[email protected](edge+" -> "+alts);
         DFAState s = NewState();
         s.LookaheadDepth = 1;
         Label e = GetLabelForSet( edge );
         s0.AddTransition( s, e );
         if ( alts.Count == 1 )
         {
             s.acceptState = true;
             int alt = alts[0];
             SetAcceptState( alt, s );
             s.cachedUniquelyPredicatedAlt = alt;
         }
         else
         {
             // resolve with syntactic predicates.  Add edges from
             // state s that test predicates.
             s.IsResolvedWithPredicates = true;
             for ( int i = 0; i < alts.Count; i++ )
             {
                 int alt = (int)alts[i];
                 s.cachedUniquelyPredicatedAlt = NFA.INVALID_ALT_NUMBER;
                 DFAState predDFATarget = GetAcceptState( alt );
                 if ( predDFATarget == null )
                 {
                     predDFATarget = NewState(); // create if not there.
                     predDFATarget.acceptState = true;
                     predDFATarget.cachedUniquelyPredicatedAlt = alt;
                     SetAcceptState( alt, predDFATarget );
                 }
                 // add a transition to pred target from d
                 /*
                 int walkAlt =
                     decisionStartState.translateDisplayAltToWalkAlt(alt);
                 NFAState altLeftEdge = nfa.grammar.getNFAStateForAltOfDecision(decisionStartState, walkAlt);
                 NFAState altStartState = (NFAState)altLeftEdge.transition[0].target;
                 SemanticContext ctx = nfa.grammar.ll1Analyzer.getPredicates(altStartState);
                 [email protected]("sem ctx = "+ctx);
                 if ( ctx == null ) {
                     ctx = new SemanticContext.TruePredicate();
                 }
                 s.addTransition(predDFATarget, new Label(ctx));
                 */
                 SemanticContext.Predicate synpred =
                     GetSynPredForAlt( decisionStartState, alt );
                 if ( synpred == null )
                 {
                     synpred = new SemanticContext.TruePredicate();
                 }
                 s.AddTransition( predDFATarget, new PredicateLabel( synpred ) );
             }
         }
     }
     //[email protected]("dfa for preds=\n"+this);
 }