private static void Deform(ITokenItem item, ICaptureTokenStructuralItem structuralItem, ITokenExpression owner)
        {
            /* *
             * Items reduced to their max are for recognizer sections..
             * */
            if ((item.RepeatOptions.Options & ScannableEntryItemRepeatOptions.MaxReduce) == ScannableEntryItemRepeatOptions.MaxReduce && string.IsNullOrEmpty(item.Name))
            {
                return;
            }
            switch (item.RepeatOptions.Options & (ScannableEntryItemRepeatOptions.OneOrMore | ScannableEntryItemRepeatOptions.ZeroOrMore | ScannableEntryItemRepeatOptions.ZeroOrOne))
            {
            case ScannableEntryItemRepeatOptions.ZeroOrOne:
                structuralItem.Optional = true;
                break;

            case ScannableEntryItemRepeatOptions.ZeroOrMore:
            case ScannableEntryItemRepeatOptions.OneOrMore:
                if (structuralItem.ResultType == ResultedDataType.Character)
                {
                    if (structuralItem is ICaptureTokenCharRangeStructuralItem)
                    {
                        var ctcrsi = (ICaptureTokenCharRangeStructuralItem)structuralItem;
                        if (!ctcrsi.HasSiblings)
                        {
                            ctcrsi.ResultType = ResultedDataType.String;
                            return;
                        }
                    }
                }
                structuralItem.Optional = true;
                //structuralItem.Rank++;
                break;
            }
        }
 internal static void ObtainReplacements(ICaptureTokenStructuralItem target, Dictionary <ITokenSource, ICaptureTokenStructuralItem> result)
 {
     foreach (var source in target.Sources)
     {
         if (!result.ContainsKey(source))
         {
             result.Add(source, target);
         }
     }
     if (target is ICaptureTokenStructure)
     {
         ObtainReplacements((ICaptureTokenStructure)target, result);
     }
 }
 protected override ICaptureTokenStructuralItem PerformUnion(ICaptureTokenStructuralItem rightElement)
 {
     if (rightElement is ICaptureTokenLiteralStructuralItem)
     {
         var rightLiteral = (ICaptureTokenLiteralStructuralItem)rightElement;
         CaptureTokenLiteralStructuralItem result = new CaptureTokenLiteralStructuralItem(this.sources.First());
         result.sources.AddRange(this.sources.Skip(1).ToArray());
         result.sources.AddRange(rightLiteral.Sources.ToArray());
         result.ResultType = this.ResultType;
         if (result.ResultType == ResultedDataType.Character && rightElement.ResultType == ResultedDataType.String)
         {
             result.ResultType = ResultedDataType.String;
         }
         result.Optional = this.Optional || rightElement.Optional;
         return(result);
     }
     else
     {
         return(new CaptureTokenGeneralStructuralItem(this.sources.Concat(rightElement.Sources).ToArray()));
     }
 }
 protected override ICaptureTokenStructuralItem PerformUnion(ICaptureTokenStructuralItem rightElement)
 {
     if (rightElement is ICaptureTokenCharRangeStructuralItem)
     {
         var rightRange = (ICaptureTokenCharRangeStructuralItem)rightElement;
         var result     = new CaptureTokenCharRangeStructuralItem(this.sources.Concat(rightRange.Sources).Distinct());
         result.ResultType = this.ResultType;
         if (result.ResultType == ResultedDataType.Character && rightElement.ResultType == ResultedDataType.String)
         {
             result.ResultType = ResultedDataType.String;
         }
         if (this.GroupOptional || rightElement.GroupOptional)
         {
             result.GroupOptional = true;
         }
         //result.Rank = Math.Max(this.Rank, rightElement.Rank);
         return(result);
     }
     else
     {
         return(new CaptureTokenGeneralStructuralItem(this.sources.Concat(rightElement.Sources)));
     }
 }
 protected override ICaptureTokenStructuralItem PerformUnion(ICaptureTokenStructuralItem rightElement)
 {
     return(new CaptureTokenGeneralStructuralItem(this.sources.Concat(rightElement.Sources).ToArray()));
 }
        private static ICaptureTokenStructuralItem BuildStructureFor(InlinedTokenEntry entry, ITokenExpressionSeries expressionSeries, ITokenExpression expression, ITokenItem item, IOilexerGrammarFile source)
        {
            ICaptureTokenStructuralItem result = null;

            if (item is ITokenGroupItem)
            {
                var tokenGroup = ((ITokenGroupItem)(item));
                result = BuildStructureFor(entry, tokenGroup, source);
                if (result.ResultType == ResultedDataType.None && !string.IsNullOrEmpty(item.Name))
                {
                    if (tokenGroup.Count == 1 && tokenGroup[0].Count == 1)
                    {
                        var singleItem = tokenGroup[0][0];
                        if (singleItem is ILiteralCharTokenItem || singleItem is ILiteralCharReferenceTokenItem)
                        {
                            if (singleItem.RepeatOptions == ScannableEntryItemRepeatInfo.None && tokenGroup.RepeatOptions == ScannableEntryItemRepeatInfo.None)
                            {
                                result.ResultType = ResultedDataType.Character;
                            }
                            else
                            {
                                result.ResultType = ResultedDataType.String;
                            }
                        }
                        else
                        {
                            result.ResultType = ResultedDataType.String;
                        }
                    }
                    else
                    {
                        result.ResultType = ResultedDataType.String;
                    }
                }
                bool groupOptional = tokenGroup != null &&
                                     ((tokenGroup.RepeatOptions.Options & ScannableEntryItemRepeatOptions.ZeroOrMore) == ScannableEntryItemRepeatOptions.ZeroOrMore ||
                                      (tokenGroup.RepeatOptions.Options & ScannableEntryItemRepeatOptions.ZeroOrOne) == ScannableEntryItemRepeatOptions.ZeroOrOne ||
                                      (((tokenGroup.RepeatOptions.Options & ScannableEntryItemRepeatOptions.Specific) == ScannableEntryItemRepeatOptions.Specific) &&
                                       (!tokenGroup.RepeatOptions.Min.HasValue || tokenGroup.RepeatOptions.Min.Value == 0)));
                if (groupOptional)
                {
                    result.GroupOptional = groupOptional;
                }
                if (item.Name.IsEmptyOrNull())
                {
                    result.ResultType = ResultedDataType.PassThrough;

                    /*
                     * if ((item.RepeatOptions.Options & ScannableEntryItemRepeatOptions.ZeroOrMore) == ScannableEntryItemRepeatOptions.ZeroOrMore ||
                     *  (item.RepeatOptions.Options & ScannableEntryItemRepeatOptions.ZeroOrOne) == ScannableEntryItemRepeatOptions.ZeroOrOne ||
                     *  ((item.RepeatOptions.Options & ScannableEntryItemRepeatOptions.Specific) == ScannableEntryItemRepeatOptions.Specific &&
                     *  (!item.RepeatOptions.Min.HasValue || item.RepeatOptions.Min.Value == 0)))
                     *  foreach (var element in ((ICaptureTokenStructure)result).Values)
                     *      element.Optional = true;*/
                }

                ((ControlledCollection <ITokenSource>)(result.Sources)).baseList.Add(item);
            }
            else if (item is ILiteralTokenItem)
            {
                result = new CaptureTokenLiteralStructuralItem((ILiteralTokenItem)item);
                if (entry.CaptureKind == RegularCaptureType.Transducer)
                {
                    result.ResultType = ResultedDataType.EnumerationItem;
                }
                else if (entry.CaptureKind == RegularCaptureType.ContextfulTransducer)
                {
                    result.ResultType = ResultedDataType.FlagEnumerationItem;
                }
            }
            else if (item is ICharRangeTokenItem)
            {
                result = new CaptureTokenCharRangeStructuralItem((ICharRangeTokenItem)item);
                if (entry.CaptureKind == RegularCaptureType.Transducer)
                {
                    result.ResultType = ResultedDataType.EnumerationItem;
                }
                else if (entry.CaptureKind == RegularCaptureType.ContextfulTransducer)
                {
                    result.ResultType = ResultedDataType.FlagEnumerationItem;
                }
            }

            Deform(item, result, expression);

            return(result);
        }
 private static IEnumerable <Tuple <ICaptureTokenStructuralItem, bool> > YieldValue(ICaptureTokenStructuralItem item, bool value)
 {
     yield return(Tuple.Create(item, value));
 }
Beispiel #8
0
 protected abstract ICaptureTokenStructuralItem PerformUnion(ICaptureTokenStructuralItem rightElement);
Beispiel #9
0
        //public int Rank { get; set; }

        public ICaptureTokenStructuralItem Union(ICaptureTokenStructuralItem rightElement)
        {
            return(this.PerformUnion(rightElement));
        }