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