/** 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); }
/** 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); }