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