public static SyntacticalNFAState BuildNFA(this IRuleReferenceProductionRuleItem ruleReference, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
        {
            SyntacticalNFAState state    = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);
            GrammarVocabulary   movement = new GrammarVocabulary(symbols, symbols[ruleReference.Reference]);
            var stateEnd = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);

            state.MoveTo(movement, stateEnd);
            return(state);
        }
        public static SyntacticalNFAState BuildNFA <T, TLiteral>(this ILiteralReferenceProductionRuleItem <T, TLiteral> item, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
            where TLiteral :
        ILiteralTokenItem <T>
        {
            SyntacticalNFAState state    = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);
            GrammarVocabulary   movement = new GrammarVocabulary(symbols, symbols[item.Literal]);
            var stateEnd = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);

            state.MoveTo(movement, stateEnd);
            return(state);
        }
        public static SyntacticalNFAState BuildNFA(this IProductionRuleItem item, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
        {
            SyntacticalNFAState result = null;

            if (item is IProductionRuleGroupItem)
            {
                result = ((IProductionRuleSeries)item).BuildNFA(symbols, lookup, replacements);
            }
            else if (item is ILiteralCharReferenceProductionRuleItem)
            {
                result = ((ILiteralCharReferenceProductionRuleItem)(item)).BuildNFA(symbols, lookup, replacements);
            }
            else if (item is ILiteralStringReferenceProductionRuleItem)
            {
                result = ((ILiteralStringReferenceProductionRuleItem)(item)).BuildNFA(symbols, lookup, replacements);
            }
            else if (item is ITokenReferenceProductionRuleItem)
            {
                result = ((ITokenReferenceProductionRuleItem)(item)).BuildNFA(symbols, lookup, replacements);
            }
            else if (item is IRuleReferenceProductionRuleItem)
            {
                result = ((IRuleReferenceProductionRuleItem)(item)).BuildNFA(symbols, lookup, replacements);
            }
            else
            {
                throw new ArgumentException("series");
            }
            if (result == null)
            {
                return(null);
            }
            var source = replacements.ContainsKey(item) ? (IProductionRuleSource)replacements[item] : (IProductionRuleSource)item;

            result.HandleRepeatCycle <GrammarVocabulary, SyntacticalNFAState, SyntacticalDFAState, IProductionRuleSource, SyntacticalNFARootState, IProductionRuleItem>(item, item, OilexerGrammarInliningCore.ProductionRuleRootStateClonerCache, () => new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols));
            List <SyntacticalNFAState> flatForm = new List <SyntacticalNFAState>();

            SyntacticalNFAState.FlatlineState(result, flatForm);
            result.SetInitial(source);
            foreach (var fState in flatForm)
            {
                fState.SetIntermediate(source);
            }
            foreach (var edge in result.ObtainEdges())
            {
                edge.SetFinal(source);
            }
            return(result);
        }
        public static SyntacticalNFAState BuildNFA(this IProductionRuleSeries series, SyntacticalNFAState root, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
        {
            SyntacticalNFAState state = root;
            bool first = true;

            foreach (var expression in series)
            {
                if (state == null)
                {
                    state = expression.BuildNFA(symbols, lookup, replacements);
                    first = false;
                }
                else
                {
                    var expressionNFA = expression.BuildNFA(symbols, lookup, replacements);
                    if (first)
                    {
                        bool isEdge = expressionNFA.IsEdge;
                        first = false;
                        state.Union(expressionNFA);
                        if (state.IsEdge && !isEdge)
                        {
                            state.IsEdge = isEdge;
                        }
                    }
                    else
                    {
                        state.Union(expressionNFA);
                    }
                }
            }
            if (!(series is IProductionRuleGroupItem))
            {
                List <SyntacticalNFAState> flatForm = new List <SyntacticalNFAState>();
                SyntacticalNFAState.FlatlineState(state, flatForm);
                var source = (replacements.ContainsKey(series) ? (IProductionRuleSource)replacements[series] : (IProductionRuleSource)series);
                state.SetInitial(source);
                foreach (var fState in flatForm)
                {
                    fState.SetIntermediate(source);
                }
                foreach (var edge in state.ObtainEdges())
                {
                    edge.SetFinal(source);
                }
            }
            return(state);
        }
        public static SyntacticalNFAState BuildNFA(this IProductionRule rule, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
        {
            SyntacticalNFAState state = null;

            foreach (var item in rule)
            {
                if (state == null)
                {
                    state = item.BuildNFA(symbols, lookup, replacements);
                }
                else
                {
                    var nextState = item.BuildNFA(symbols, lookup, replacements);
                    if (nextState != null)
                    {
                        state.Concat(nextState);
                    }
                }
            }
            return(state);
        }
        public static SyntacticalNFAState BuildNFA(this ITokenReferenceProductionRuleItem tokenReference, IGrammarSymbolSet symbols, ControlledDictionary <IOilexerGrammarProductionRuleEntry, SyntacticalDFARootState> lookup, Dictionary <IProductionRuleSource, IProductionRuleCaptureStructuralItem> replacements)
        {
            SyntacticalNFAState state = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);
            var symbol = symbols[tokenReference.Reference];
            GrammarVocabulary movement = null;

            if (symbol is IGrammarConstantItemSymbol)
            {
                IGrammarConstantItemSymbol constantItemSymbol = (IGrammarConstantItemSymbol)symbol;
                movement = new GrammarVocabulary(symbols, (from s in symbols
                                                           let cis = s as IGrammarConstantItemSymbol
                                                                     where cis != null && cis.Source == constantItemSymbol.Source
                                                                     select cis).ToArray());
            }
            else
            {
                movement = new GrammarVocabulary(symbols, symbol);
            }
            var stateEnd = new SyntacticalNFAState(lookup, (GrammarSymbolSet)symbols);

            state.MoveTo(movement, stateEnd);
            return(state);
        }