/// <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(); }
public RowRecogExprNodeNested( RowRecogNFATypeEnum type, RowRecogExprRepeatDesc optionalRepeat) { Type = type; OptionalRepeat = optionalRepeat; }
/// <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); }
/// <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; }