示例#1
0
        /// <summary>
        /// Returns indicator if optional matches.
        /// </summary>
        /// <returns>indicator</returns>
        public static bool IsOptional(this RowRecogNFATypeEnum value)
        {
            switch (value) {
                case RowRecogNFATypeEnum.SINGLE:
                    return false;

                case RowRecogNFATypeEnum.ZERO_TO_MANY:
                    return true;

                case RowRecogNFATypeEnum.ONE_TO_MANY:
                    return false;

                case RowRecogNFATypeEnum.ONE_OPTIONAL:
                    return true;

                case RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT:
                    return true;

                case RowRecogNFATypeEnum.ONE_TO_MANY_RELUCTANT:
                    return false;

                case RowRecogNFATypeEnum.ONE_OPTIONAL_RELUCTANT:
                    return true;
            }

            throw new ArgumentException();
        }
示例#2
0
 public RowRecogExprNodeNested(
     RowRecogNFATypeEnum type,
     RowRecogExprRepeatDesc optionalRepeat)
 {
     Type = type;
     OptionalRepeat = optionalRepeat;
 }
示例#3
0
        /// <summary>
        /// Return postfix.
        /// </summary>
        /// <returns>postfix</returns>
        public static string GetOptionalPostfix(this RowRecogNFATypeEnum value)
        {
            switch (value) {
                case RowRecogNFATypeEnum.SINGLE:
                    return "";

                case RowRecogNFATypeEnum.ZERO_TO_MANY:
                    return "*";

                case RowRecogNFATypeEnum.ONE_TO_MANY:
                    return "+";

                case RowRecogNFATypeEnum.ONE_OPTIONAL:
                    return "?";

                case RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT:
                    return "*?";

                case RowRecogNFATypeEnum.ONE_TO_MANY_RELUCTANT:
                    return "+?";

                case RowRecogNFATypeEnum.ONE_OPTIONAL_RELUCTANT:
                    return "??";
            }

            throw new ArgumentException();
        }
 public RowRecogExprNode Copy(
     RowRecogExprNode nodeToCopy,
     RowRecogNFATypeEnum newType,
     ExpressionCopier expressionCopier)
 {
     var atom = (RowRecogExprNodeAtom) nodeToCopy;
     return new RowRecogExprNodeAtom(atom.Tag, newType, null);
 }
示例#5
0
 /// <summary>
 ///     Ctor.
 /// </summary>
 /// <param name="tag">variable name</param>
 /// <param name="type">multiplicity and greedy indicator</param>
 /// <param name="optionalRepeat">optional repeating information</param>
 public RowRecogExprNodeAtom(
     string tag,
     RowRecogNFATypeEnum type,
     RowRecogExprRepeatDesc optionalRepeat)
 {
     Tag = tag;
     Type = type;
     OptionalRepeat = optionalRepeat;
 }
            public RowRecogExprNode Copy(
                RowRecogExprNode nodeToCopy,
                RowRecogNFATypeEnum newType,
                ExpressionCopier expressionCopier)
            {
                var nested = (RowRecogExprNodeNested) nodeToCopy;
                var nestedCopy = new RowRecogExprNodeNested(newType, null);
                foreach (var inner in nested.ChildNodes) {
                    var innerCopy = inner.CheckedCopy(expressionCopier);
                    nestedCopy.AddChildNode(innerCopy);
                }

                return nestedCopy;
            }
        private static IList<RowRecogExprNode> ExpandRepeat(
            RowRecogExprNode node,
            RowRecogExprRepeatDesc repeat,
            RowRecogNFATypeEnum type,
            RowRegexExprNodeCopier copier, 
            ExpressionCopier expressionCopier)
        {
            // handle single-bounds (no ranges)
            IList<RowRecogExprNode> repeated = new List<RowRecogExprNode>();
            if (repeat.Single != null) {
                ValidateExpression(repeat.Single);
                var numRepeated = (int) repeat.Single.Forge.ExprEvaluator.Evaluate(null, true, null);
                ValidateRange(numRepeated, 1, int.MaxValue);
                for (var i = 0; i < numRepeated; i++) {
                    var copy = copier.Copy(node, type, expressionCopier);
                    repeated.Add(copy);
                }

                return repeated;
            }

            // evaluate bounds
            int? lower = null;
            int? upper = null;
            if (repeat.Lower != null) {
                ValidateExpression(repeat.Lower);
                lower = (int?) repeat.Lower.Forge.ExprEvaluator.Evaluate(null, true, null);
            }

            if (repeat.Upper != null) {
                ValidateExpression(repeat.Upper);
                upper = (int?) repeat.Upper.Forge.ExprEvaluator.Evaluate(null, true, null);
            }

            // handle range
            if (lower != null && upper != null) {
                ValidateRange(lower.Value, 1, int.MaxValue);
                ValidateRange(upper.Value, 1, int.MaxValue);
                ValidateRange(lower.Value, 1, upper.Value);
                for (var i = 0; i < lower; i++) {
                    var copy = copier.Copy(node, type, expressionCopier);
                    repeated.Add(copy);
                }

                for (var i = lower.Value; i < upper; i++) {
                    // makeInline type optional
                    var newType = type;
                    if (type == RowRecogNFATypeEnum.SINGLE) {
                        newType = RowRecogNFATypeEnum.ONE_OPTIONAL;
                    }
                    else if (type == RowRecogNFATypeEnum.ONE_TO_MANY) {
                        newType = RowRecogNFATypeEnum.ZERO_TO_MANY;
                    }
                    else if (type == RowRecogNFATypeEnum.ONE_TO_MANY_RELUCTANT) {
                        newType = RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT;
                    }

                    var copy = copier.Copy(node, newType, expressionCopier);
                    repeated.Add(copy);
                }

                return repeated;
            }

            // handle lower-bounds only
            if (upper == null) {
                ValidateRange(lower.Value, 1, int.MaxValue);
                for (var i = 0; i < lower; i++) {
                    repeated.Add(copier.Copy(node, type, expressionCopier));
                }

                // makeInline type optional
                var newType = type;
                if (type == RowRecogNFATypeEnum.SINGLE) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY;
                }
                else if (type == RowRecogNFATypeEnum.ONE_OPTIONAL) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY;
                }
                else if (type == RowRecogNFATypeEnum.ONE_OPTIONAL_RELUCTANT) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT;
                }
                else if (type == RowRecogNFATypeEnum.ONE_TO_MANY) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY;
                }
                else if (type == RowRecogNFATypeEnum.ONE_TO_MANY_RELUCTANT) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT;
                }

                var copy = copier.Copy(node, newType, expressionCopier);
                repeated.Add(copy);
                return repeated;
            }

            // handle upper-bounds only
            ValidateRange(upper.Value, 1, int.MaxValue);
            for (var i = 0; i < upper; i++) {
                // makeInline type optional
                var newType = type;
                if (type == RowRecogNFATypeEnum.SINGLE) {
                    newType = RowRecogNFATypeEnum.ONE_OPTIONAL;
                }
                else if (type == RowRecogNFATypeEnum.ONE_TO_MANY) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY;
                }
                else if (type == RowRecogNFATypeEnum.ONE_TO_MANY_RELUCTANT) {
                    newType = RowRecogNFATypeEnum.ZERO_TO_MANY_RELUCTANT;
                }

                var copy = copier.Copy(node, newType, expressionCopier);
                repeated.Add(copy);
            }

            return repeated;
        }