コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
 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);
 }