private static IProductionRuleItem Deliteralize <T, TLiteral>(this ILiteralProductionRuleItem <T> literal, IOilexerGrammarProductionRuleEntry currentEntry, IList <IOilexerGrammarTokenEntry> availableStock, OilexerGrammarFile file, Func <ILiteralProductionRuleItem <T>, TLiteral> createNewLiteral, Func <TLiteral, IOilexerGrammarTokenEntry, IProductionRuleItem> createLiteralReference, ICompilerErrorCollection errors) where TLiteral : ILiteralTokenItem <T> { { ITokenItem foundItem = null; IOilexerGrammarTokenEntry literalContainerEntry = null; if ((foundItem = FindItemFromStock <T>(literal, currentEntry, availableStock, out literalContainerEntry, file, false)) != null) { var result = createLiteralReference(((TLiteral)(foundItem)), literalContainerEntry); ((LiteralProductionRuleItem <T>)literal).CloneData(result); return(result); } } IOilexerGrammarTokenEntry extractionsToken; if ((extractionsToken = availableStock.OilexerGrammarFindScannableEntry("__EXTRACTIONS")) == null) { extractionsToken = new OilexerGrammarTokenEntry("__EXTRACTIONS", new TokenExpressionSeries(new ITokenExpression[0], literal.Line, literal.Column, literal.Position, currentEntry.FileName), currentEntry.ScanMode, currentEntry.FileName, literal.Column, literal.Line, literal.Position, false, new List <OilexerGrammarTokens.IdentifierToken>(), false); availableStock.Add(extractionsToken); file.Add(extractionsToken); } TLiteral tokenLiteralItem = createNewLiteral(literal); ((TokenExpressionSeries)extractionsToken.Branches).Add(new TokenExpression(new List <ITokenItem>(new ITokenItem[] { tokenLiteralItem }), currentEntry.FileName, literal.Column, literal.Line, literal.Position)); var tokenReferenceItem = createLiteralReference(((TLiteral)(tokenLiteralItem)), extractionsToken); ((LiteralProductionRuleItem <T>)literal).CloneData(tokenReferenceItem); return(tokenReferenceItem); }
private static ITokenItem FindItemFromStock <T>(ILiteralProductionRuleItem <T> literal, IOilexerGrammarProductionRuleEntry currentEntry, IList <IOilexerGrammarTokenEntry> availableStock, out IOilexerGrammarTokenEntry entry, OilexerGrammarFile file, bool followReferences) { entry = null; ITokenItem foundItem = null; foreach (IOilexerGrammarTokenEntry ite in availableStock) { if (ite.ForcedRecognizer) { continue; } ITokenItem iti = ite.FindTokenItemByValue <T>(literal.Value, file, followReferences); if (iti != null) { foundItem = iti; entry = ite; break; } } return(foundItem); }
public static IProductionRuleItem Deliteralize(this ILiteralProductionRuleItem ruleItem, IOilexerGrammarProductionRuleEntry currentEntry, IList <IOilexerGrammarTokenEntry> availableStock, OilexerGrammarFile file, ICompilerErrorCollection errors) { if (ruleItem is ILiteralCharProductionRuleItem) { return(Deliteralize <char, ILiteralCharTokenItem>(((ILiteralCharProductionRuleItem)(ruleItem)), currentEntry, availableStock, file, literal => { LiteralCharTokenItem result = new LiteralCharTokenItem(literal.Value, ((ILiteralCharProductionRuleItem)(literal)).CaseInsensitive, literal.Column, literal.Line, literal.Position); if (literal.Name != null && literal.Name != string.Empty) { result.Name = literal.Name; } else { result.Name = ExtractName(result.Value); } return result; }, (literal, destination) => { if (destination.Name != "__EXTRACTIONS" && (destination.Branches.Count == 1 && destination.Branches[0].Count == 1)) { return new TokenReferenceProductionRuleItem(destination, literal.Column, literal.Line, literal.Position); } else if (!(literal.Name != null && literal.Name != string.Empty)) { literal.Name = ExtractName(literal.Value); } return new LiteralCharReferenceProductionRuleItem((ILiteralCharTokenItem)literal, destination, literal.Column, literal.Line, literal.Position, ruleItem.Flag, ruleItem.Counter); }, errors)); } else if (ruleItem is ILiteralStringProductionRuleItem) { return(Deliteralize <string, ILiteralStringTokenItem>(((ILiteralStringProductionRuleItem)(ruleItem)), currentEntry, availableStock, file, literal => { LiteralStringTokenItem result = new LiteralStringTokenItem(literal.Value, ((ILiteralStringProductionRuleItem)(literal)).CaseInsensitive, literal.Column, literal.Line, literal.Position, false); if (literal.Name != null && literal.Name != string.Empty) { result.Name = literal.Name; } else { result.Name = ExtractName(result.Value); } return result; }, (literal, destination) => { if (destination.Name != "__EXTRACTIONS" && (destination.Branches.Count == 1 && destination.Branches[0].Count == 1)) { return new TokenReferenceProductionRuleItem(destination, literal.Column, literal.Line, literal.Position); } else if (string.IsNullOrEmpty(literal.Name)) { literal.Name = ExtractName(literal.Value); } LiteralStringReferenceProductionRuleItem result = new LiteralStringReferenceProductionRuleItem((ILiteralStringTokenItem)literal, destination, literal.Column, literal.Line, literal.Position, ruleItem.Flag, ruleItem.Counter); if (ruleItem.Flag) { result.Name = ExtractName(literal.Value); } return result; }, errors)); } return(ruleItem); }