1313 references to RegexNodeKind
System.Text.RegularExpressions (1313)
System\Text\RegularExpressions\RegexCompiler.cs (135)
512if (RegexPrefixAnalyzer.FindTrailingAnchor(_regexTree.Root) == RegexNodeKind.End && 668case RegexNodeKind.Bol: 747case RegexNodeKind.End or RegexNodeKind.EndZ when _regexTree.FindOptimizations.MaxPossibleLength is int maxLength: 1268Debug.Assert(target.LoopNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic); 1451Debug.Assert(node.Kind == RegexNodeKind.Capture, "Every generated tree should begin with a capture node"); 1461case RegexNodeKind.Multi or RegexNodeKind.Notone or RegexNodeKind.One or RegexNodeKind.Set: 1467int length = node.Kind == RegexNodeKind.Multi ? node.Str!.Length : 1; 1667Debug.Assert(node.Kind is RegexNodeKind.Alternate, $"Unexpected type: {node.Kind}"); 2027case RegexNodeKind.One: 2028case RegexNodeKind.Set: 2033case RegexNodeKind.Multi: 2039case RegexNodeKind.Concatenate when child.Child(0) == startingLiteralNode && (startingLiteralNode.Kind is RegexNodeKind.One or RegexNodeKind.Set or RegexNodeKind.Multi): 2049child.Child(0).Kind is RegexNodeKind.Multi ? 2051new RegexNode(RegexNodeKind.Empty, child.Options)); 2089Debug.Assert(multi.Kind is RegexNodeKind.Multi, $"Expected a Multi node, got {multi.Kind}"); 2091new(RegexNodeKind.One, multi.Options, multi.Str[1]) : 2092new(RegexNodeKind.Multi, multi.Options, multi.Str.Substring(1)); 2099Debug.Assert(node.Kind is RegexNodeKind.Backreference, $"Unexpected type: {node.Kind}"); 2274Debug.Assert(node.Kind is RegexNodeKind.BackreferenceConditional, $"Unexpected type: {node.Kind}"); 2288RegexNode? noBranch = node.Child(1) is { Kind: not RegexNodeKind.Empty } childNo ? childNo : null; 2433Debug.Assert(node.Kind is RegexNodeKind.ExpressionConditional, $"Unexpected type: {node.Kind}"); 2449RegexNode? noBranch = node.Child(2) is { Kind: not RegexNodeKind.Empty } childNo ? childNo : null; 2626Debug.Assert(node.Kind is RegexNodeKind.Capture, $"Unexpected type: {node.Kind}"); 2752Debug.Assert(node.Kind is RegexNodeKind.PositiveLookaround, $"Unexpected type: {node.Kind}"); 2796Debug.Assert(node.Kind is RegexNodeKind.NegativeLookaround, $"Unexpected type: {node.Kind}"); 2947case RegexNodeKind.Beginning: 2948case RegexNodeKind.Start: 2949case RegexNodeKind.Bol: 2950case RegexNodeKind.Eol: 2951case RegexNodeKind.End: 2952case RegexNodeKind.EndZ: 2956case RegexNodeKind.Boundary: 2957case RegexNodeKind.NonBoundary: 2958case RegexNodeKind.ECMABoundary: 2959case RegexNodeKind.NonECMABoundary: 2963case RegexNodeKind.Multi: 2967case RegexNodeKind.One: 2968case RegexNodeKind.Notone: 2969case RegexNodeKind.Set: 2973case RegexNodeKind.Oneloop: 2974case RegexNodeKind.Notoneloop: 2975case RegexNodeKind.Setloop: 2979case RegexNodeKind.Onelazy: 2980case RegexNodeKind.Notonelazy: 2981case RegexNodeKind.Setlazy: 2985case RegexNodeKind.Oneloopatomic: 2986case RegexNodeKind.Notoneloopatomic: 2987case RegexNodeKind.Setloopatomic: 2991case RegexNodeKind.Loop: 2995case RegexNodeKind.Lazyloop: 2999case RegexNodeKind.Alternate: 3003case RegexNodeKind.Concatenate: 3007case RegexNodeKind.Atomic: 3011case RegexNodeKind.Backreference: 3015case RegexNodeKind.BackreferenceConditional: 3019case RegexNodeKind.ExpressionConditional: 3023case RegexNodeKind.Capture: 3027case RegexNodeKind.PositiveLookaround: 3031case RegexNodeKind.NegativeLookaround: 3035case RegexNodeKind.Nothing: 3039case RegexNodeKind.Empty: 3043case RegexNodeKind.UpdateBumpalong: 3055Debug.Assert(node.Kind is RegexNodeKind.Atomic or RegexNodeKind.PositiveLookaround or RegexNodeKind.NegativeLookaround or RegexNodeKind.ExpressionConditional, $"Unexpected type: {node.Kind}"); 3056Debug.Assert(node.Kind is RegexNodeKind.ExpressionConditional ? node.ChildCount() >= 1 : node.ChildCount() == 1, $"Unexpected number of children: {node.ChildCount()}"); 3062if (node.Kind is RegexNodeKind.Atomic && !analysis.MayBacktrack(child)) 3099Debug.Assert(node.Kind is RegexNodeKind.UpdateBumpalong, $"Unexpected type: {node.Kind}"); 3119Debug.Assert(node.Kind is RegexNodeKind.Concatenate, $"Unexpected type: {node.Kind}"); 3177if (next.Kind is not RegexNodeKind.UpdateBumpalong) // skip node types that don't have a semantic impact 3265Debug.Assert(node.Kind is RegexNodeKind.Boundary or RegexNodeKind.NonBoundary or RegexNodeKind.ECMABoundary or RegexNodeKind.NonECMABoundary, $"Unexpected type: {node.Kind}"); 3283case RegexNodeKind.Boundary or RegexNodeKind.NonBoundary: 3297if (node.Kind is RegexNodeKind.Boundary) 3310if (node.Kind is RegexNodeKind.ECMABoundary) 3325Debug.Assert(node.Kind is RegexNodeKind.Beginning or RegexNodeKind.Start or RegexNodeKind.Bol or RegexNodeKind.End or RegexNodeKind.EndZ or RegexNodeKind.Eol, $"Unexpected type: {node.Kind}"); 3332case RegexNodeKind.Beginning: 3333case RegexNodeKind.Start: 3344if (node.Kind == RegexNodeKind.Beginning) 3356case RegexNodeKind.Bol: 3387case RegexNodeKind.End: 3404case RegexNodeKind.EndZ: 3421goto case RegexNodeKind.Eol; 3423case RegexNodeKind.Eol: 3463Debug.Assert(node.Kind is RegexNodeKind.Multi, $"Unexpected type: {node.Kind}"); 3515Debug.Assert(node.Kind is RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop, $"Unexpected type: {node.Kind}"); 3731Debug.Assert(node.Kind is RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy, $"Unexpected type: {node.Kind}"); 3832node.Kind is RegexNodeKind.Notonelazy && 3973node.Kind is RegexNodeKind.Setlazy && 4078Debug.Assert(node.Kind is RegexNodeKind.Lazyloop, $"Unexpected type: {node.Kind}"); 4589Debug.Assert(node.Kind is RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic, $"Unexpected type: {node.Kind}"); 4836Debug.Assert(node.Kind is RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic, $"Unexpected type: {node.Kind}"); 4925Debug.Assert(node.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop, $"Unexpected type: {node.Kind}"); 4963Debug.Assert(node.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop, $"Unexpected type: {node.Kind}"); 5361if (node.Kind == RegexNodeKind.Multi) 5394if (node.Kind == RegexNodeKind.Multi) 5587if (root.Kind is RegexNodeKind.Multi or RegexNodeKind.One or RegexNodeKind.Notone or RegexNodeKind.Set) 5605Ldc((root.Kind == RegexNodeKind.Multi ? root.Str!.Length : 1) * (!rtl ? 1 : -1));
System\Text\RegularExpressions\RegexFindOptimizations.cs (23)
56if (rightToLeft && LeadingAnchor == RegexNodeKind.Bol) 59LeadingAnchor = RegexNodeKind.Unknown; 61if (LeadingAnchor is RegexNodeKind.Beginning or RegexNodeKind.Start or RegexNodeKind.EndZ or RegexNodeKind.End) 65(RegexNodeKind.Beginning, false) => FindNextStartingPositionMode.LeadingAnchor_LeftToRight_Beginning, 66(RegexNodeKind.Beginning, true) => FindNextStartingPositionMode.LeadingAnchor_RightToLeft_Beginning, 67(RegexNodeKind.Start, false) => FindNextStartingPositionMode.LeadingAnchor_LeftToRight_Start, 68(RegexNodeKind.Start, true) => FindNextStartingPositionMode.LeadingAnchor_RightToLeft_Start, 69(RegexNodeKind.End, false) => FindNextStartingPositionMode.LeadingAnchor_LeftToRight_End, 70(RegexNodeKind.End, true) => FindNextStartingPositionMode.LeadingAnchor_RightToLeft_End, 83if (TrailingAnchor is RegexNodeKind.End or RegexNodeKind.EndZ && 90FindMode = TrailingAnchor == RegexNodeKind.End ? 280LeadingAnchor == RegexNodeKind.Bol; // there's a leading BOL anchor we can otherwise search for 286public RegexNodeKind LeadingAnchor { get; private set; } 289public RegexNodeKind TrailingAnchor { get; } 409Debug.Assert(LeadingAnchor != RegexNodeKind.Bol, "BOL isn't enabled for RTL"); 535if (LeadingAnchor == RegexNodeKind.Bol) 822Debug.Assert(loopNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic);
System\Text\RegularExpressions\RegexNode.cs (720)
23public RegexNodeKind Kind { get; private set; } 26/// <remarks>For a <see cref="RegexNodeKind.Multi"/>, this is the string from the expression. For an <see cref="IsSetFamily"/> node, this is the character class string from <see cref="RegexCharClass"/>.</remarks> 51public RegexNode(RegexNodeKind kind, RegexOptions options) 57public RegexNode(RegexNodeKind kind, RegexOptions options, char ch) 64public RegexNode(RegexNodeKind kind, RegexOptions options, string str) 71public RegexNode(RegexNodeKind kind, RegexOptions options, int m) 78public RegexNode(RegexNodeKind kind, RegexOptions options, int m, int n) 89Debug.Assert(Kind is RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or 90RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or 91RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic); 121return new RegexNode(RegexNodeKind.One, options & ~RegexOptions.IgnoreCase, ch); 127return new RegexNode(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet); 131return new RegexNode(RegexNodeKind.One, options, ch); 138Kind == RegexNodeKind.Concatenate && 150private void MakeRep(RegexNodeKind kind, int min, int max) 152Kind += kind - RegexNodeKind.One; 169case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop: 172Kind += RegexNodeKind.Oneloopatomic - RegexNodeKind.Oneloop; 175case RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy: 179Kind += RegexNodeKind.Oneloopatomic - RegexNodeKind.Onelazy; 189Kind = RegexNodeKind.Empty; 193else if (Kind == RegexNodeKind.Oneloopatomic && N is >= 2 and <= MultiVsRepeaterLimit) 197Kind = RegexNodeKind.Multi; 204case RegexNodeKind.Loop: 205if (Parent is not { Kind: RegexNodeKind.Atomic }) 207RegexNode loopAsChild = new(RegexNodeKind.Loop, Options, M, N); 208Kind = RegexNodeKind.Atomic; 215case RegexNodeKind.Lazyloop: 225goto case RegexNodeKind.Loop; 228Kind = RegexNodeKind.Empty; 243Debug.Assert(Kind == RegexNodeKind.Capture, "Every generated tree should begin with a capture node"); 262Debug.Assert(Kind != RegexNodeKind.Group, "All Group nodes should have been removed."); 267case RegexNodeKind.Group: 271case RegexNodeKind.Beginning: 272case RegexNodeKind.Bol: 273case RegexNodeKind.Boundary: 274case RegexNodeKind.ECMABoundary: 275case RegexNodeKind.Empty: 276case RegexNodeKind.End: 277case RegexNodeKind.EndZ: 278case RegexNodeKind.Eol: 279case RegexNodeKind.Multi: 280case RegexNodeKind.NonBoundary: 281case RegexNodeKind.NonECMABoundary: 282case RegexNodeKind.Nothing: 283case RegexNodeKind.Notone: 284case RegexNodeKind.Notonelazy: 285case RegexNodeKind.Notoneloop: 286case RegexNodeKind.Notoneloopatomic: 287case RegexNodeKind.One: 288case RegexNodeKind.Onelazy: 289case RegexNodeKind.Oneloop: 290case RegexNodeKind.Oneloopatomic: 291case RegexNodeKind.Backreference: 292case RegexNodeKind.Set: 293case RegexNodeKind.Setlazy: 294case RegexNodeKind.Setloop: 295case RegexNodeKind.Setloopatomic: 296case RegexNodeKind.Start: 297case RegexNodeKind.UpdateBumpalong: 301case RegexNodeKind.Atomic: 302case RegexNodeKind.Capture: 303case RegexNodeKind.Lazyloop: 304case RegexNodeKind.Loop: 305case RegexNodeKind.NegativeLookaround: 306case RegexNodeKind.PositiveLookaround: 310case RegexNodeKind.BackreferenceConditional: 314case RegexNodeKind.ExpressionConditional: 318case RegexNodeKind.Concatenate: 319case RegexNodeKind.Alternate: 331case RegexNodeKind.Multi: 336case RegexNodeKind.Set: 337case RegexNodeKind.Setloop: 338case RegexNodeKind.Setloopatomic: 339case RegexNodeKind.Setlazy: 351case RegexNodeKind.Backreference: 372Debug.Assert(rootNode.Kind == RegexNodeKind.Capture); 415case RegexNodeKind.Atomic: 419case RegexNodeKind.Concatenate: 424case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when node.N == int.MaxValue: 425case RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when node.N == int.MaxValue && !atomicByAncestry: 426if (node.Parent is { Kind: RegexNodeKind.Concatenate } parent) 428parent.InsertChild(1, new RegexNode(RegexNodeKind.UpdateBumpalong, node.Options)); 476case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop: 477case RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy: 483case RegexNodeKind.Atomic: 484case RegexNodeKind.PositiveLookaround: 485case RegexNodeKind.NegativeLookaround: 495case RegexNodeKind.Capture: 496case RegexNodeKind.Concatenate when !rtl: 498if ((existingChild.Kind is RegexNodeKind.Alternate or RegexNodeKind.BackreferenceConditional or RegexNodeKind.ExpressionConditional or RegexNodeKind.Loop or RegexNodeKind.Lazyloop) && 499node.Parent is not { Kind: RegexNodeKind.Atomic }) // validate grandparent isn't atomic 501var atomic = new RegexNode(RegexNodeKind.Atomic, existingChild.Options); 511case RegexNodeKind.Alternate: 512case RegexNodeKind.BackreferenceConditional: 513case RegexNodeKind.ExpressionConditional: 521if (node.Kind != RegexNodeKind.ExpressionConditional) // ReduceExpressionConditional will have already applied ending backtracking removal 536case RegexNodeKind.Lazyloop: 537case RegexNodeKind.Loop: 542Debug.Assert(node.Kind is RegexNodeKind.Atomic or RegexNodeKind.Empty or RegexNodeKind.Loop or RegexNodeKind.Lazyloop); 544if (node.Kind is RegexNodeKind.Atomic) 547Debug.Assert(node.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop); 550if (node.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop) 584case RegexNodeKind.Backreference: 591RegexNodeKind.Alternate => ReduceAlternation(), 592RegexNodeKind.Atomic => ReduceAtomic(), 593RegexNodeKind.Concatenate => ReduceConcatenation(), 594RegexNodeKind.Group => ReduceGroup(), 595RegexNodeKind.Loop or RegexNodeKind.Lazyloop => ReduceLoops(), 596RegexNodeKind.PositiveLookaround or RegexNodeKind.NegativeLookaround => ReduceLookaround(), 597RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy => ReduceSet(), 598RegexNodeKind.ExpressionConditional => ReduceExpressionConditional(), 599RegexNodeKind.BackreferenceConditional => ReduceBackreferenceConditional(), 612Debug.Assert(Kind is RegexNodeKind.Alternate or RegexNodeKind.Concatenate); 6150 => new RegexNode(Kind == RegexNodeKind.Alternate ? RegexNodeKind.Nothing : RegexNodeKind.Empty, Options), 629Debug.Assert(Kind == RegexNodeKind.Group); 632while (u.Kind == RegexNodeKind.Group) 657Debug.Assert(Kind == RegexNodeKind.Atomic); 662while (child.Kind == RegexNodeKind.Atomic) 672case RegexNodeKind.Empty: 673case RegexNodeKind.Nothing: 677case RegexNodeKind.Oneloopatomic: 678case RegexNodeKind.Notoneloopatomic: 679case RegexNodeKind.Setloopatomic: 684case RegexNodeKind.Oneloop: 685case RegexNodeKind.Notoneloop: 686case RegexNodeKind.Setloop: 687case RegexNodeKind.Onelazy: 688case RegexNodeKind.Notonelazy: 689case RegexNodeKind.Setlazy: 695case RegexNodeKind.Alternate: 704if (branches[0].Kind == RegexNodeKind.Empty) 706return new RegexNode(RegexNodeKind.Empty, child.Options); 715if (branches[i].Kind == RegexNodeKind.Empty) 796(child.Child(0).Kind is RegexNodeKind.Empty || child.Child(1).Kind is RegexNodeKind.Empty); // can be transformed into a ? or ?? 811return child.Kind == RegexNodeKind.Empty ? 826Debug.Assert(Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop); 829RegexNodeKind kind = Kind; 842if (kind == RegexNodeKind.Loop) 846case RegexNodeKind.Oneloop: 847case RegexNodeKind.Oneloopatomic: 848case RegexNodeKind.Notoneloop: 849case RegexNodeKind.Notoneloopatomic: 850case RegexNodeKind.Setloop: 851case RegexNodeKind.Setloopatomic: 860case RegexNodeKind.Onelazy: 861case RegexNodeKind.Notonelazy: 862case RegexNodeKind.Setlazy: 896return new RegexNode(RegexNodeKind.Nothing, Options); 907case RegexNodeKind.One: 908case RegexNodeKind.Notone: 909case RegexNodeKind.Set: 910child.MakeRep(u.Kind == RegexNodeKind.Lazyloop ? RegexNodeKind.Onelazy : RegexNodeKind.Oneloop, u.M, u.N); 914case RegexNodeKind.Empty: 919case RegexNodeKind.PositiveLookaround when ContainsKind(child, [RegexNodeKind.Capture]) is false: 920case RegexNodeKind.NegativeLookaround or 921RegexNodeKind.Beginning or RegexNodeKind.Start or 922RegexNodeKind.Bol or RegexNodeKind.Eol or 923RegexNodeKind.End or RegexNodeKind.EndZ or 924RegexNodeKind.Boundary or RegexNodeKind.ECMABoundary or 925RegexNodeKind.NonBoundary or RegexNodeKind.NonECMABoundary: 935u = u.M == 0 ? new RegexNode(RegexNodeKind.Empty, Options) : child; 958Debug.Assert(Kind is RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy); 963Kind = RegexNodeKind.Nothing; 971Kind == RegexNodeKind.Set ? RegexNodeKind.One : 972Kind == RegexNodeKind.Setloop ? RegexNodeKind.Oneloop : 973Kind == RegexNodeKind.Setloopatomic ? RegexNodeKind.Oneloopatomic : 974RegexNodeKind.Onelazy; 981Kind == RegexNodeKind.Set ? RegexNodeKind.Notone : 982Kind == RegexNodeKind.Setloop ? RegexNodeKind.Notoneloop : 983Kind == RegexNodeKind.Setloopatomic ? RegexNodeKind.Notoneloopatomic : 984RegexNodeKind.Notonelazy; 1018Debug.Assert(Kind == RegexNodeKind.Alternate); 1023return new RegexNode(RegexNodeKind.Nothing, Options); 1031if (node.Kind == RegexNodeKind.Alternate) 1034if (node.Kind == RegexNodeKind.Alternate) 1037if (node.Kind == RegexNodeKind.Alternate) 1045if (node.Kind is RegexNodeKind.Alternate && node.ChildCount() == 2) 1047if (node.Child(1).Kind is RegexNodeKind.Empty) 1051else if (node.Child(0).Kind is RegexNodeKind.Empty) 1088if (at.Kind == RegexNodeKind.Alternate) 1106else if (at.Kind is RegexNodeKind.Set or RegexNodeKind.One) 1111if (at.Kind == RegexNodeKind.Set) 1135if (prev.Kind == RegexNodeKind.One) 1145if (at.Kind == RegexNodeKind.One) 1155prev.Kind = RegexNodeKind.Set; 1162else if (at.Kind == RegexNodeKind.Nothing) 1186Debug.Assert(alternation.Kind == RegexNodeKind.Alternate); 1199if (child.Kind != RegexNodeKind.Concatenate || child.ChildCount() < 2) 1216case RegexNodeKind.One or RegexNodeKind.Notone or RegexNodeKind.Set: 1217case RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Setloopatomic: 1218case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop or RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when required.M == required.N: 1219case RegexNodeKind.Beginning or RegexNodeKind.Start or RegexNodeKind.Bol 1220or RegexNodeKind.End or RegexNodeKind.EndZ or RegexNodeKind.Eol 1221or RegexNodeKind.Boundary or RegexNodeKind.ECMABoundary 1222or RegexNodeKind.NonBoundary or RegexNodeKind.NonECMABoundary: 1252var newAlternate = new RegexNode(RegexNodeKind.Alternate, alternation.Options); 1260if (alternation.Parent is RegexNode { Kind: RegexNodeKind.Atomic }) 1262var atomic = new RegexNode(RegexNodeKind.Atomic, alternation.Options); 1269var newConcat = new RegexNode(RegexNodeKind.Concatenate, alternation.Options); 1285Debug.Assert(node.Kind == RegexNodeKind.Alternate); 1296case RegexNodeKind.Empty when !seenEmpty: 1300case RegexNodeKind.Empty: 1301case RegexNodeKind.Nothing: 1328Debug.Assert(alternation.Kind == RegexNodeKind.Alternate); 1355if (startingNode.Kind == RegexNodeKind.One) 1375if (startingNode.Kind == RegexNodeKind.One) 1389Debug.Assert(startingNode.Kind == RegexNodeKind.Multi); 1420new RegexNode(RegexNodeKind.One, startingNodeOptions, startingSpan[0]) : 1421new RegexNode(RegexNodeKind.Multi, startingNodeOptions, startingSpan.ToString()); 1422var newAlternate = new RegexNode(RegexNodeKind.Alternate, startingNodeOptions); 1426ProcessOneOrMulti(branch.Kind == RegexNodeKind.Concatenate ? branch.Child(0) : branch, startingSpan); 1434if (node.Kind == RegexNodeKind.One) 1438node.Kind = RegexNodeKind.Empty; 1443Debug.Assert(node.Kind == RegexNodeKind.Multi); 1447node.Kind = RegexNodeKind.Empty; 1452node.Kind = RegexNodeKind.One; 1464if (alternation.Parent is RegexNode parent && parent.Kind == RegexNodeKind.Atomic) 1466var atomic = new RegexNode(RegexNodeKind.Atomic, startingNodeOptions); 1471var newConcat = new RegexNode(RegexNodeKind.Concatenate, startingNodeOptions); 1491RegexNode branch = Kind == RegexNodeKind.Concatenate ? Child(0) : this; 1492return branch.Kind is RegexNodeKind.One or RegexNodeKind.Multi ? branch : null; 1498Debug.Assert(Kind is RegexNodeKind.One or RegexNodeKind.Multi || (IsOneFamily && M > 0)); 1513Debug.Assert(Kind is RegexNodeKind.Alternate); 1537if (startingLiteralNode.IsOneFamily || startingLiteralNode.Kind is RegexNodeKind.Multi) 1583case RegexNodeKind.One: 1584case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: 1585case RegexNodeKind.Notone: 1586case RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy when node.M > 0: 1587case RegexNodeKind.Set: 1588case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when node.M > 0: 1589case RegexNodeKind.Multi: 1592case RegexNodeKind.Atomic: 1593case RegexNodeKind.Concatenate: 1594case RegexNodeKind.Capture: 1595case RegexNodeKind.Group: 1596case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 1597case RegexNodeKind.PositiveLookaround when allowZeroWidth: 1618case RegexNodeKind.One or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy: 1621case RegexNodeKind.Notone or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy: 1624case RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy: 1640case RegexNodeKind.Multi: 1683Debug.Assert(Kind == RegexNodeKind.Concatenate); 1689return new RegexNode(RegexNodeKind.Empty, Options); 1699if (child.Kind == RegexNodeKind.Nothing) 1725Debug.Assert(Kind == RegexNodeKind.Concatenate); 1742if (at.Kind == RegexNodeKind.Concatenate && 1761else if (at.Kind is RegexNodeKind.Multi or RegexNodeKind.One) 1775if (prev.Kind == RegexNodeKind.One) 1777prev.Kind = RegexNodeKind.Multi; 1782((at.Kind == RegexNodeKind.One) ? $"{prev.Str}{at.Ch}" : prev.Str + at.Str) : 1783((at.Kind == RegexNodeKind.One) ? $"{at.Ch}{prev.Str}" : at.Str + prev.Str); 1785else if (at.Kind == RegexNodeKind.Empty) 1808Debug.Assert(Kind == RegexNodeKind.Concatenate); 1846case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy when nextNode.Kind == currentNode.Kind && currentNode.Ch == nextNode.Ch: 1847case RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy when nextNode.Kind == currentNode.Kind && currentNode.Str == nextNode.Str: 1849currentNode.Kind is RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Setloopatomic) 1872case RegexNodeKind.Oneloop or RegexNodeKind.Onelazy when nextNode.Kind == RegexNodeKind.One && currentNode.Ch == nextNode.Ch: 1873case RegexNodeKind.Notoneloop or RegexNodeKind.Notonelazy when nextNode.Kind == RegexNodeKind.Notone && currentNode.Ch == nextNode.Ch: 1874case RegexNodeKind.Setloop or RegexNodeKind.Setlazy when nextNode.Kind == RegexNodeKind.Set && currentNode.Str == nextNode.Str: 1888case RegexNodeKind.Oneloop or RegexNodeKind.Onelazy when 1889nextNode.Kind == RegexNodeKind.Multi && 1922nextNode.Kind = RegexNodeKind.One; 1940case RegexNodeKind.One when (nextNode.Kind is RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy) && currentNode.Ch == nextNode.Ch: 1941case RegexNodeKind.Notone when (nextNode.Kind is RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy) && currentNode.Ch == nextNode.Ch: 1942case RegexNodeKind.Set when (nextNode.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) && currentNode.Str == nextNode.Str: 1955case RegexNodeKind.Notone when nextNode.Kind == currentNode.Kind && currentNode.Ch == nextNode.Ch: 1956case RegexNodeKind.Set when nextNode.Kind == RegexNodeKind.Set && currentNode.Str == nextNode.Str: 1957currentNode.MakeRep(RegexNodeKind.Oneloop, 2, 2); 1962case RegexNodeKind.Beginning or RegexNodeKind.Start or 1963RegexNodeKind.End or RegexNodeKind.EndZ or 1964RegexNodeKind.Bol or RegexNodeKind.Eol or 1965RegexNodeKind.Boundary or RegexNodeKind.NonBoundary or 1966RegexNodeKind.ECMABoundary or RegexNodeKind.NonECMABoundary 2010if (Kind is not RegexNodeKind.Concatenate) 2034while (node.Kind is RegexNodeKind.Capture or RegexNodeKind.Concatenate) 2042case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop when CanBeMadeAtomic(node, subsequent, iterateNullableSubsequent: true, allowLazy: false): 2051case RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when CanBeMadeAtomic(node, subsequent, iterateNullableSubsequent: false, allowLazy: true): 2067node.Kind -= RegexNodeKind.Onelazy - RegexNodeKind.Oneloop; // lazy to greedy 2071case RegexNodeKind.Loop when CanBeMadeAtomic(node, subsequent, iterateNullableSubsequent: true, allowLazy: false): 2072case RegexNodeKind.Lazyloop when CanBeMadeAtomic(node, subsequent, iterateNullableSubsequent: false, allowLazy: true): 2086while (loopChild.Kind is RegexNodeKind.Capture or RegexNodeKind.Concatenate) 2092RegexNodeKind.Boundary or RegexNodeKind.ECMABoundary or 2093RegexNodeKind.Multi or 2094RegexNodeKind.One or RegexNodeKind.Notone or RegexNodeKind.Set) 2099else if (node.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop) 2103goto case RegexNodeKind.Loop; 2111case RegexNodeKind.Loop: 2121case RegexNodeKind.Lazyloop: 2131case RegexNodeKind.Alternate or RegexNodeKind.BackreferenceConditional or RegexNodeKind.ExpressionConditional: 2142for (int b = node.Kind == RegexNodeKind.ExpressionConditional ? 1 : 0; b < alternateBranches; b++) 2156Debug.Assert(Kind is RegexNodeKind.PositiveLookaround or RegexNodeKind.NegativeLookaround); 2164if (Kind is RegexNodeKind.NegativeLookaround && ContainsKind(Child(0), [RegexNodeKind.Backreference, RegexNodeKind.BackreferenceConditional]) is false) 2179if (node is { Kind: RegexNodeKind.Capture, N: -1 }) 2210if (Kind is RegexNodeKind.PositiveLookaround) 2213child.Kind is RegexNodeKind.Empty) 2218else if (Kind is RegexNodeKind.NegativeLookaround) 2223if (child.Kind is RegexNodeKind.Empty) 2225Kind = RegexNodeKind.Nothing; 2233private static bool IsZeroWidthAssertion(RegexNodeKind kind) => kind is 2234RegexNodeKind.PositiveLookaround or RegexNodeKind.NegativeLookaround or 2235RegexNodeKind.Beginning or RegexNodeKind.Start or 2236RegexNodeKind.Bol or RegexNodeKind.Eol or 2237RegexNodeKind.End or RegexNodeKind.EndZ or 2238RegexNodeKind.Boundary or RegexNodeKind.ECMABoundary or 2239RegexNodeKind.NonBoundary or RegexNodeKind.NonECMABoundary or 2240RegexNodeKind.UpdateBumpalong; 2244private static bool? ContainsKind(RegexNode node, ReadOnlySpan<RegexNodeKind> kinds) 2246foreach (RegexNodeKind kind in kinds) 2276Debug.Assert(Kind == RegexNodeKind.BackreferenceConditional); 2285AddChild(new RegexNode(RegexNodeKind.Empty, Options)); 2294Debug.Assert(Kind == RegexNodeKind.ExpressionConditional); 2303AddChild(new RegexNode(RegexNodeKind.Empty, Options)); 2312if (condition.Kind == RegexNodeKind.PositiveLookaround && (condition.Options & RegexOptions.RightToLeft) == 0) 2339while (node.Kind is RegexNodeKind.Capture or RegexNodeKind.Concatenate) 2357case RegexNodeKind.Concatenate: 2358case RegexNodeKind.Capture: 2359case RegexNodeKind.Atomic: 2363case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when subsequent.M > 0: 2371case RegexNodeKind.PositiveLookaround when (subsequent.Options & RegexOptions.RightToLeft) == 0: 2395case RegexNodeKind.Alternate: 2396case RegexNodeKind.ExpressionConditional when childCount is 3: // condition, yes, and no branch 2411case RegexNodeKind.Oneloop: 2412case RegexNodeKind.Onelazy when allowLazy: 2415case RegexNodeKind.One when node.Ch != subsequent.Ch: 2416case RegexNodeKind.Notone when node.Ch == subsequent.Ch: 2417case RegexNodeKind.Set when !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2418case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch != subsequent.Ch: 2419case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2420case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2421case RegexNodeKind.Multi when node.Ch != subsequent.Str![0]: 2422case RegexNodeKind.End: 2423case RegexNodeKind.EndZ or RegexNodeKind.Eol when node.Ch != '\n': 2424case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsBoundaryWordChar(node.Ch): 2425case RegexNodeKind.NonBoundary when node.M > 0 && !RegexCharClass.IsBoundaryWordChar(node.Ch): 2426case RegexNodeKind.ECMABoundary when node.M > 0 && RegexCharClass.IsECMAWordChar(node.Ch): 2427case RegexNodeKind.NonECMABoundary when node.M > 0 && !RegexCharClass.IsECMAWordChar(node.Ch): 2430case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch != subsequent.Ch: 2431case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2432case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(node.Ch, subsequent.Str!): 2441case RegexNodeKind.Notoneloop: 2442case RegexNodeKind.Notonelazy when allowLazy: 2445case RegexNodeKind.One when node.Ch == subsequent.Ch: 2446case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && node.Ch == subsequent.Ch: 2447case RegexNodeKind.Multi when node.Ch == subsequent.Str![0]: 2448case RegexNodeKind.End: 2451case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && node.Ch == subsequent.Ch: 2460case RegexNodeKind.Setloop: 2461case RegexNodeKind.Setlazy when allowLazy: 2464case RegexNodeKind.One when !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2465case RegexNodeKind.Set when !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2466case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2467case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2468case RegexNodeKind.Multi when !RegexCharClass.CharInClass(subsequent.Str![0], node.Str!): 2469case RegexNodeKind.End: 2470case RegexNodeKind.EndZ or RegexNodeKind.Eol when !RegexCharClass.CharInClass('\n', node.Str!): 2471case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(node.Str!): 2472case RegexNodeKind.NonBoundary when node.M > 0 && node.Str is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass: 2473case RegexNodeKind.ECMABoundary when node.M > 0 && node.Str is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass: 2474case RegexNodeKind.NonECMABoundary when node.M > 0 && node.Str is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass: 2477case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !RegexCharClass.CharInClass(subsequent.Ch, node.Str!): 2478case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !RegexCharClass.MayOverlap(node.Str!, subsequent.Str!): 2487case RegexNodeKind.Loop: 2488case RegexNodeKind.Lazyloop when allowLazy: 2511case RegexNodeKind.One when !CharInStartingOrEndingSet(subsequent.Ch): 2512case RegexNodeKind.Set when !MayOverlapStartingOrEndingSet(subsequent.Str!): 2513case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M > 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2514case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M > 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2515case RegexNodeKind.Multi when !CharInStartingOrEndingSet(subsequent.Str![0]): 2516case RegexNodeKind.End: 2517case RegexNodeKind.EndZ or RegexNodeKind.Eol when !CharInStartingOrEndingSet('\n'): 2518case RegexNodeKind.Boundary when node.M > 0 && RegexCharClass.IsKnownWordClassSubset(loopStartingSet) && RegexCharClass.IsKnownWordClassSubset(loopEndingSet): 2519case RegexNodeKind.NonBoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotWordClass or RegexCharClass.NotDigitClass): 2520case RegexNodeKind.ECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass) && (loopEndingSet is RegexCharClass.ECMAWordClass or RegexCharClass.ECMADigitClass): 2521case RegexNodeKind.NonECMABoundary when node.M > 0 && (loopStartingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass) && (loopEndingSet is RegexCharClass.NotECMAWordClass or RegexCharClass.NotDigitClass): 2524case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when subsequent.M == 0 && !CharInStartingOrEndingSet(subsequent.Ch): 2525case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when subsequent.M == 0 && !MayOverlapStartingOrEndingSet(subsequent.Str!): 2553case RegexNodeKind.Atomic: 2554case RegexNodeKind.Alternate: 2555case RegexNodeKind.Capture: 2559case RegexNodeKind.Concatenate: 2598Debug.Assert(node.Kind is not RegexNodeKind.Concatenate, "The existing logic assumes that the node itself isn't a concatenation."); 2611case RegexNodeKind.Atomic: 2612case RegexNodeKind.Alternate: 2613case RegexNodeKind.Capture: 2617case RegexNodeKind.Concatenate: 2653case RegexNodeKind.One: 2654case RegexNodeKind.Notone: 2655case RegexNodeKind.Set: 2659case RegexNodeKind.Multi: 2663case RegexNodeKind.Notonelazy: 2664case RegexNodeKind.Notoneloop: 2665case RegexNodeKind.Notoneloopatomic: 2666case RegexNodeKind.Onelazy: 2667case RegexNodeKind.Oneloop: 2668case RegexNodeKind.Oneloopatomic: 2669case RegexNodeKind.Setlazy: 2670case RegexNodeKind.Setloop: 2671case RegexNodeKind.Setloopatomic: 2675case RegexNodeKind.Lazyloop: 2676case RegexNodeKind.Loop: 2680case RegexNodeKind.Alternate: 2693case RegexNodeKind.BackreferenceConditional: 2697case RegexNodeKind.ExpressionConditional: 2701case RegexNodeKind.Concatenate: 2713case RegexNodeKind.Atomic: 2714case RegexNodeKind.Capture: 2715case RegexNodeKind.Group: 2720case RegexNodeKind.Empty: 2721case RegexNodeKind.Nothing: 2722case RegexNodeKind.UpdateBumpalong: 2726case RegexNodeKind.Beginning: 2727case RegexNodeKind.Bol: 2728case RegexNodeKind.Boundary: 2729case RegexNodeKind.ECMABoundary: 2730case RegexNodeKind.End: 2731case RegexNodeKind.EndZ: 2732case RegexNodeKind.Eol: 2733case RegexNodeKind.NonBoundary: 2734case RegexNodeKind.NonECMABoundary: 2735case RegexNodeKind.Start: 2736case RegexNodeKind.NegativeLookaround: 2737case RegexNodeKind.PositiveLookaround: 2739case RegexNodeKind.Backreference: 2747goto case RegexNodeKind.Empty; 2766case RegexNodeKind.One: 2767case RegexNodeKind.Notone: 2768case RegexNodeKind.Set: 2772case RegexNodeKind.Multi: 2776case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or 2777RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or 2778RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic: 2782case RegexNodeKind.Loop or RegexNodeKind.Lazyloop: 2797case RegexNodeKind.Alternate: 2820case RegexNodeKind.BackreferenceConditional: 2821case RegexNodeKind.ExpressionConditional: 2824int i = Kind == RegexNodeKind.BackreferenceConditional ? 0 : 1; 2830case RegexNodeKind.Concatenate: 2852case RegexNodeKind.Atomic: 2853case RegexNodeKind.Capture: 2858case RegexNodeKind.Empty: 2859case RegexNodeKind.Nothing: 2860case RegexNodeKind.UpdateBumpalong: 2861case RegexNodeKind.Beginning: 2862case RegexNodeKind.Bol: 2863case RegexNodeKind.Boundary: 2864case RegexNodeKind.ECMABoundary: 2865case RegexNodeKind.End: 2866case RegexNodeKind.EndZ: 2867case RegexNodeKind.Eol: 2868case RegexNodeKind.NonBoundary: 2869case RegexNodeKind.NonECMABoundary: 2870case RegexNodeKind.Start: 2871case RegexNodeKind.PositiveLookaround: 2872case RegexNodeKind.NegativeLookaround: 2876case RegexNodeKind.Backreference: 2884goto case RegexNodeKind.Empty; 2907Debug.Assert(Kind == RegexNodeKind.Concatenate, $"Expected Concatenate, got {Kind}"); 2920if (child.Kind is RegexNodeKind.One) 2933else if (child.Kind is RegexNodeKind.Multi) 2945else if (child.Kind is RegexNodeKind.Set || 2946(child.Kind is RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic && child.M == child.N)) 2955vsb.Append((char)(twoChars[0] | 0x20), child.Kind is RegexNodeKind.Set ? 1 : child.M); 2957else if (child.Kind is RegexNodeKind.Empty) 3008Debug.Assert(Kind == RegexNodeKind.Concatenate, $"Expected Concatenate, got {Kind}"); 3012RegexNodeKind.One or RegexNodeKind.Notone or RegexNodeKind.Set => true, 3013RegexNodeKind.Multi => true, 3014RegexNodeKind.Oneloop or RegexNodeKind.Onelazy or RegexNodeKind.Oneloopatomic or 3015RegexNodeKind.Notoneloop or RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloopatomic or 3016RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic 3058return new RegexNode(RegexNodeKind.Empty, Options); 3064case <= MultiVsRepeaterLimit when Kind == RegexNodeKind.One: 3070Kind = RegexNodeKind.Multi; 3079case RegexNodeKind.One: 3080case RegexNodeKind.Notone: 3081case RegexNodeKind.Set: 3082MakeRep(lazy ? RegexNodeKind.Onelazy : RegexNodeKind.Oneloop, min, max); 3086var result = new RegexNode(lazy ? RegexNodeKind.Lazyloop : RegexNodeKind.Loop, Options, min, max); 3209public bool IsSetFamily => Kind is RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy; 3212public bool IsOneFamily => Kind is RegexNodeKind.One or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy; 3215public bool IsNotoneFamily => Kind is RegexNodeKind.Notone or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy; 3266case RegexNodeKind.Oneloop: 3267case RegexNodeKind.Oneloopatomic: 3268case RegexNodeKind.Notoneloop: 3269case RegexNodeKind.Notoneloopatomic: 3270case RegexNodeKind.Onelazy: 3271case RegexNodeKind.Notonelazy: 3272case RegexNodeKind.One: 3273case RegexNodeKind.Notone: 3276case RegexNodeKind.Capture: 3283case RegexNodeKind.Backreference: 3284case RegexNodeKind.BackreferenceConditional: 3287case RegexNodeKind.Multi: 3295case RegexNodeKind.Set: 3296case RegexNodeKind.Setloop: 3297case RegexNodeKind.Setloopatomic: 3298case RegexNodeKind.Setlazy: 3305case RegexNodeKind.Oneloop: 3306case RegexNodeKind.Oneloopatomic: 3307case RegexNodeKind.Notoneloop: 3308case RegexNodeKind.Notoneloopatomic: 3309case RegexNodeKind.Onelazy: 3310case RegexNodeKind.Notonelazy: 3311case RegexNodeKind.Setloop: 3312case RegexNodeKind.Setloopatomic: 3313case RegexNodeKind.Setlazy: 3314case RegexNodeKind.Loop: 3315case RegexNodeKind.Lazyloop:
System\Text\RegularExpressions\RegexParser.cs (60)
277StartGroup(new RegexNode(RegexNodeKind.Capture, (_options & ~RegexOptions.IgnoreCase), 0, -1)); 347_unit = new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, setString); 394_unit = new RegexNode((_options & RegexOptions.Multiline) != 0 ? RegexNodeKind.Bol : RegexNodeKind.Beginning, _options); 398_unit = new RegexNode((_options & RegexOptions.Multiline) != 0 ? RegexNodeKind.Eol : RegexNodeKind.EndZ, _options); 403new RegexNode(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, RegexCharClass.AnyClass) : 404new RegexNode(RegexNodeKind.Notone, _options & ~RegexOptions.IgnoreCase, '\n'); 521_concatenation = new RegexNode(RegexNodeKind.Concatenate, _options); 759return new RegexNode(RegexNodeKind.Group, _options); 763return new RegexNode(RegexNodeKind.Capture, _options, _autocap++, -1); 776RegexNodeKind nodeType; 783nodeType = RegexNodeKind.Group; 789nodeType = RegexNodeKind.PositiveLookaround; 795nodeType = RegexNodeKind.NegativeLookaround; 800nodeType = RegexNodeKind.Atomic; 823nodeType = RegexNodeKind.PositiveLookaround; 834nodeType = RegexNodeKind.NegativeLookaround; 937return new RegexNode(RegexNodeKind.Capture, _options, capnum, uncapnum); 959return new RegexNode(RegexNodeKind.BackreferenceConditional, _options, capnum); 973return new RegexNode(RegexNodeKind.BackreferenceConditional, _options, tmpCapnum); 978nodeType = RegexNodeKind.ExpressionConditional; 1002nodeType = RegexNodeKind.Group; 1004if (_group!.Kind != RegexNodeKind.ExpressionConditional) 1096new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass); 1101new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass); 1106new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass); 1111new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass); 1116new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass); 1121new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass); 1138return new RegexNode(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), cc.ToStringClass()); 1142if (result != null && result.Kind == RegexNodeKind.Backreference && (result.Options & RegexOptions.IgnoreCase) != 0) 1203IsCaptureSlot(capnum) ? new RegexNode(RegexNodeKind.Backreference, _options, capnum) : 1235return scanOnly ? null : new RegexNode(RegexNodeKind.Backreference, _options, capnum); 1249return new RegexNode(RegexNodeKind.Backreference, _options, capnum); 1269_capnames?[capname] is int tmpCapnum ? new RegexNode(RegexNodeKind.Backreference, _options, tmpCapnum) : 1345return new RegexNode(RegexNodeKind.Backreference, _options, capnum); 1355return new RegexNode(RegexNodeKind.Backreference, _options, capnum); 1367return new RegexNode(RegexNodeKind.Backreference, _options, tmpCapnum); 1405return new RegexNode(RegexNodeKind.Backreference, _options, capnum); 1653private readonly RegexNodeKind TypeFromCode(char ch) => 1656'b' => (_options & RegexOptions.ECMAScript) != 0 ? RegexNodeKind.ECMABoundary : RegexNodeKind.Boundary, 1657'B' => (_options & RegexOptions.ECMAScript) != 0 ? RegexNodeKind.NonECMABoundary : RegexNodeKind.NonBoundary, 1658'A' => RegexNodeKind.Beginning, 1659'G' => RegexNodeKind.Start, 1660'Z' => RegexNodeKind.EndZ, 1661'z' => RegexNodeKind.End, 1662_ => RegexNodeKind.Nothing, 2004_concatenation!.AddChild(new RegexNode(RegexNodeKind.Multi, _options & ~RegexOptions.IgnoreCase, _pattern.Substring(pos, cch))); 2034if (_group.Kind == RegexNodeKind.ExpressionConditional && _group.ChildCount() == 0) 2050_alternation = new RegexNode(RegexNodeKind.Alternate, _options); 2051_concatenation = new RegexNode(RegexNodeKind.Concatenate, _options); 2059if (_group!.Kind is RegexNodeKind.ExpressionConditional or RegexNodeKind.BackreferenceConditional) 2068_concatenation = new RegexNode(RegexNodeKind.Concatenate, _options); 2074if (_group!.Kind is RegexNodeKind.ExpressionConditional or RegexNodeKind.BackreferenceConditional) 2078if (_group.Kind == RegexNodeKind.BackreferenceConditional && _group.ChildCount() > 2 || _group.ChildCount() > 3)
System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (224)
84case RegexNodeKind.Atomic: 85case RegexNodeKind.Capture: 90case RegexNodeKind.Bol: 91case RegexNodeKind.Eol: 92case RegexNodeKind.Boundary: 93case RegexNodeKind.ECMABoundary: 94case RegexNodeKind.NonBoundary: 95case RegexNodeKind.NonECMABoundary: 96case RegexNodeKind.Beginning: 97case RegexNodeKind.Start: 98case RegexNodeKind.EndZ: 99case RegexNodeKind.End: 100case RegexNodeKind.Empty: 101case RegexNodeKind.UpdateBumpalong: 102case RegexNodeKind.PositiveLookaround: 103case RegexNodeKind.NegativeLookaround: 112case RegexNodeKind.One or RegexNodeKind.Oneloop or RegexNodeKind.Onelazy or RegexNodeKind.Oneloopatomic when !ignoreCase || !RegexCharClass.ParticipatesInCaseConversion(node.Ch): 114int reps = node.Kind is RegexNodeKind.One ? 1 : Math.Min(node.M, MaxPrefixLength); 119return node.Kind is RegexNodeKind.One || reps == node.N; 124case RegexNodeKind.Multi: 156case RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic when !RegexCharClass.IsNegated(node.Str!): // negated sets are too complex to analyze 164int reps = node.Kind is RegexNodeKind.Set ? 1 : Math.Min(node.M, MaxPrefixLength); 209return node.Kind is RegexNodeKind.Set || reps == node.N; 212case RegexNodeKind.Concatenate: 226case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 242case RegexNodeKind.Alternate: 363case RegexNodeKind.Concatenate: 377case RegexNodeKind.Alternate when !rtl: // for RTL we'd need to be matching the suffixes of the alternation cases 422case RegexNodeKind.One: 427case RegexNodeKind.Multi: 432case RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy when node.M > 0: 439case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 454case RegexNodeKind.Atomic: 455case RegexNodeKind.Capture: 459case RegexNodeKind.Bol: 460case RegexNodeKind.Eol: 461case RegexNodeKind.Boundary: 462case RegexNodeKind.ECMABoundary: 463case RegexNodeKind.NonBoundary: 464case RegexNodeKind.NonECMABoundary: 465case RegexNodeKind.Beginning: 466case RegexNodeKind.Start: 467case RegexNodeKind.EndZ: 468case RegexNodeKind.End: 469case RegexNodeKind.Empty: 470case RegexNodeKind.UpdateBumpalong: 471case RegexNodeKind.PositiveLookaround: 472case RegexNodeKind.NegativeLookaround: 491case RegexNodeKind.Atomic: 492case RegexNodeKind.Capture: 493case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M > 0: 497case RegexNodeKind.Concatenate: 600case RegexNodeKind.One: 609case RegexNodeKind.Onelazy or RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic when node.M > 0: 621case RegexNodeKind.Multi: 633case RegexNodeKind.Set: 641case RegexNodeKind.Setlazy or RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic when node.M > 0: 652case RegexNodeKind.Notone: 658case RegexNodeKind.Notonelazy or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic when node.M == node.N: 662case RegexNodeKind.Beginning: 663case RegexNodeKind.Bol: 664case RegexNodeKind.Boundary: 665case RegexNodeKind.ECMABoundary: 666case RegexNodeKind.Empty: 667case RegexNodeKind.End: 668case RegexNodeKind.EndZ: 669case RegexNodeKind.Eol: 670case RegexNodeKind.NonBoundary: 671case RegexNodeKind.NonECMABoundary: 672case RegexNodeKind.UpdateBumpalong: 673case RegexNodeKind.Start: 674case RegexNodeKind.NegativeLookaround: 675case RegexNodeKind.PositiveLookaround: 681case RegexNodeKind.Atomic: 682case RegexNodeKind.Group: 683case RegexNodeKind.Capture: 686case RegexNodeKind.Lazyloop or RegexNodeKind.Loop when node.M > 0: 696case RegexNodeKind.Concatenate: 709case RegexNodeKind.Alternate when thorough: 954case RegexNodeKind.One or RegexNodeKind.Oneloop or RegexNodeKind.Onelazy or RegexNodeKind.Oneloopatomic: 959return node.Kind is RegexNodeKind.One || node.M > 0 ? true : null; 963case RegexNodeKind.Notone or RegexNodeKind.Notoneloop or RegexNodeKind.Notoneloopatomic or RegexNodeKind.Notonelazy: 977return node.Kind is RegexNodeKind.Notone || node.M > 0 ? true : null; 981case RegexNodeKind.Set or RegexNodeKind.Setloop or RegexNodeKind.Setlazy or RegexNodeKind.Setloopatomic: 996node.Kind is RegexNodeKind.Set || node.M > 0 ? true : 1000case RegexNodeKind.Multi: 1012case RegexNodeKind.Empty: 1013case RegexNodeKind.Nothing: 1014case RegexNodeKind.Bol: 1015case RegexNodeKind.Eol: 1016case RegexNodeKind.Boundary: 1017case RegexNodeKind.NonBoundary: 1018case RegexNodeKind.ECMABoundary: 1019case RegexNodeKind.NonECMABoundary: 1020case RegexNodeKind.Beginning: 1021case RegexNodeKind.Start: 1022case RegexNodeKind.EndZ: 1023case RegexNodeKind.End: 1024case RegexNodeKind.UpdateBumpalong: 1025case RegexNodeKind.PositiveLookaround: 1026case RegexNodeKind.NegativeLookaround: 1030case RegexNodeKind.Atomic: 1031case RegexNodeKind.Capture: 1037case RegexNodeKind.Loop: 1038case RegexNodeKind.Lazyloop: 1050case RegexNodeKind.Concatenate: 1081case RegexNodeKind.Alternate: 1102case RegexNodeKind.BackreferenceConditional: 1103case RegexNodeKind.ExpressionConditional: 1104int branchStart = node.Kind is RegexNodeKind.BackreferenceConditional ? 0 : 1; 1113case RegexNodeKind.Backreference: 1138while (node.Kind is RegexNodeKind.Atomic or RegexNodeKind.Capture) 1142if (node.Kind != RegexNodeKind.Concatenate) 1155while (firstChild.Kind is RegexNodeKind.Atomic or RegexNodeKind.Capture) 1159if (firstChild.Kind is not (RegexNodeKind.Setloop or RegexNodeKind.Setloopatomic or RegexNodeKind.Setlazy) || firstChild.N != int.MaxValue) 1167if (nextChild.Kind == RegexNodeKind.UpdateBumpalong) 1224while ((nextChild.Kind is RegexNodeKind.Atomic or RegexNodeKind.Capture or RegexNodeKind.Concatenate) || 1225(nextChild.Kind is RegexNodeKind.Loop or RegexNodeKind.Lazyloop && nextChild.M >= 1)) 1233(nextChild.Kind is RegexNodeKind.Set || nextChild.M >= 1)) 1279case RegexNodeKind.PositiveLookaround: 1284case RegexNodeKind.Bol: 1285case RegexNodeKind.Eol: 1286case RegexNodeKind.Beginning: 1287case RegexNodeKind.Start: 1288case RegexNodeKind.EndZ: 1289case RegexNodeKind.End: 1290case RegexNodeKind.Boundary: 1291case RegexNodeKind.ECMABoundary: 1292case RegexNodeKind.NegativeLookaround: 1293case RegexNodeKind.Empty: 1297case RegexNodeKind.Atomic: 1298case RegexNodeKind.Capture: 1303case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M >= 1: 1309case RegexNodeKind.Concatenate: 1330public static RegexNodeKind FindLeadingAnchor(RegexNode node) => 1334public static RegexNodeKind FindTrailingAnchor(RegexNode node) => 1338private static RegexNodeKind FindLeadingOrTrailingAnchor(RegexNode node, bool leading) 1344return RegexNodeKind.Unknown; 1351case RegexNodeKind.Bol: 1352case RegexNodeKind.Eol: 1353case RegexNodeKind.Beginning: 1354case RegexNodeKind.Start: 1355case RegexNodeKind.EndZ: 1356case RegexNodeKind.End: 1360case RegexNodeKind.Atomic: 1361case RegexNodeKind.Capture: 1362case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when leading && node.M >= 1: 1363case RegexNodeKind.PositiveLookaround when leading && (node.Options & RegexOptions.RightToLeft) == 0: 1373case RegexNodeKind.Concatenate: 1380RegexNodeKind bestAnchorFound = RegexNodeKind.Unknown; 1388case RegexNodeKind.Empty or RegexNodeKind.NegativeLookaround: 1389case RegexNodeKind.PositiveLookaround when ((node.Options | tmpChild.Options) & RegexOptions.RightToLeft) != 0: 1390case RegexNodeKind.Boundary or RegexNodeKind.ECMABoundary or RegexNodeKind.NonBoundary or RegexNodeKind.NonECMABoundary: 1394case RegexNodeKind.PositiveLookaround: 1416if (node.Child(i).Kind is not (RegexNodeKind.Empty or RegexNodeKind.PositiveLookaround or RegexNodeKind.NegativeLookaround)) 1424if (bestAnchorFound is not RegexNodeKind.Unknown) 1446static RegexNodeKind ChooseBetterAnchor(RegexNodeKind anchor1, RegexNodeKind anchor2) 1449anchor1 == RegexNodeKind.Unknown ? anchor2 : 1450anchor2 == RegexNodeKind.Unknown ? anchor1 : 1454static int RankAnchorQuality(RegexNodeKind node) => 1457RegexNodeKind.Beginning => 3, 1458RegexNodeKind.Start => 3, 1459RegexNodeKind.End => 3, 1460RegexNodeKind.EndZ => 3, 1462RegexNodeKind.Bol => 2, 1463RegexNodeKind.Eol => 2, 1465RegexNodeKind.Boundary => 1, 1466RegexNodeKind.ECMABoundary => 1, 1472static bool IsBestAnchor(RegexNodeKind anchor) => 1474anchor is RegexNodeKind.Beginning or RegexNodeKind.Start or RegexNodeKind.End or RegexNodeKind.EndZ; 1477case RegexNodeKind.Alternate: 1481RegexNodeKind anchor = FindLeadingOrTrailingAnchor(node.Child(0), leading); 1482if (anchor == RegexNodeKind.Unknown) 1484return RegexNodeKind.Unknown; 1494return RegexNodeKind.Unknown; 1504return RegexNodeKind.Unknown;
System\Text\RegularExpressions\RegexReplacement.cs (4)
36Debug.Assert(concat.Kind == RegexNodeKind.Concatenate, $"Expected Concatenate, got {concat.Kind}"); 50case RegexNodeKind.Multi: 54case RegexNodeKind.One: 58case RegexNodeKind.Backreference:
System\Text\RegularExpressions\RegexTreeAnalyzer.cs (25)
49case RegexNodeKind.Alternate: 50case RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.M != node.N: 51case RegexNodeKind.Oneloop or RegexNodeKind.Notoneloop or RegexNodeKind.Setloop or RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy or RegexNodeKind.Setlazy when node.M != node.N: 63case RegexNodeKind.Atomic: 64case RegexNodeKind.NegativeLookaround: 65case RegexNodeKind.PositiveLookaround: 70case RegexNodeKind.Capture: 75case RegexNodeKind.Loop: 76case RegexNodeKind.Lazyloop: 94RegexNodeKind.Atomic or RegexNodeKind.NegativeLookaround or RegexNodeKind.PositiveLookaround => true, 98RegexNodeKind.Alternate or RegexNodeKind.BackreferenceConditional or RegexNodeKind.ExpressionConditional => true, 101RegexNodeKind.Capture => true, 105RegexNodeKind.Concatenate => i == childCount - 1, 111RegexNodeKind.Loop or RegexNodeKind.Lazyloop when node.N == 1 => true,
System\Text\RegularExpressions\RegexWriter.cs (56)
14private const RegexNodeKind BeforeChild = (RegexNodeKind)64; 15private const RegexNodeKind AfterChild = (RegexNodeKind)128; 201private void EmitFragment(RegexNodeKind nodeType, RegexNode node, int curIndex) 215case RegexNodeKind.Concatenate | BeforeChild: 216case RegexNodeKind.Concatenate | AfterChild: 217case RegexNodeKind.Empty: 220case RegexNodeKind.Alternate | BeforeChild: 228case RegexNodeKind.Alternate | AfterChild: 247case RegexNodeKind.BackreferenceConditional | BeforeChild: 260case RegexNodeKind.BackreferenceConditional | AfterChild: 278case RegexNodeKind.ExpressionConditional | BeforeChild: 290case RegexNodeKind.ExpressionConditional | AfterChild: 311case RegexNodeKind.Loop | BeforeChild: 312case RegexNodeKind.Lazyloop | BeforeChild: 327case RegexNodeKind.Loop | AfterChild: 328case RegexNodeKind.Lazyloop | AfterChild: 331int Lazy = (nodeType - (RegexNodeKind.Loop | AfterChild)); 343case RegexNodeKind.Capture | BeforeChild: 347case RegexNodeKind.Capture | AfterChild: 351case RegexNodeKind.PositiveLookaround | BeforeChild: 356case RegexNodeKind.PositiveLookaround | AfterChild: 361case RegexNodeKind.NegativeLookaround | BeforeChild: 367case RegexNodeKind.NegativeLookaround | AfterChild: 373case RegexNodeKind.Atomic | BeforeChild: 377case RegexNodeKind.Atomic | AfterChild: 381case RegexNodeKind.One: 382case RegexNodeKind.Notone: 386case RegexNodeKind.Notoneloop: 387case RegexNodeKind.Notoneloopatomic: 388case RegexNodeKind.Notonelazy: 389case RegexNodeKind.Oneloop: 390case RegexNodeKind.Oneloopatomic: 391case RegexNodeKind.Onelazy: 394Emit(((node.Kind is RegexNodeKind.Oneloop or RegexNodeKind.Oneloopatomic or RegexNodeKind.Onelazy) ? 403case RegexNodeKind.Setloop: 404case RegexNodeKind.Setloopatomic: 405case RegexNodeKind.Setlazy: 419case RegexNodeKind.Multi: 423case RegexNodeKind.Set: 427case RegexNodeKind.Backreference: 431case RegexNodeKind.Nothing: 432case RegexNodeKind.Bol: 433case RegexNodeKind.Eol: 434case RegexNodeKind.Boundary: 435case RegexNodeKind.NonBoundary: 436case RegexNodeKind.ECMABoundary: 437case RegexNodeKind.NonECMABoundary: 438case RegexNodeKind.Beginning: 439case RegexNodeKind.Start: 440case RegexNodeKind.EndZ: 441case RegexNodeKind.End: 442case RegexNodeKind.UpdateBumpalong:
System\Text\RegularExpressions\Symbolic\RegexNodeConverter.cs (49)
57case RegexNodeKind.One: 61case RegexNodeKind.Notone: 65case RegexNodeKind.Set: 69case RegexNodeKind.Multi: 84case RegexNodeKind.Concatenate: 85case RegexNodeKind.Alternate: 86case RegexNodeKind.Loop: 87case RegexNodeKind.Lazyloop: 88case RegexNodeKind.Capture when node.N == -1: // N == -1 because balancing groups (which have N >= 0) aren't supported 106case RegexNodeKind.Oneloop: 107case RegexNodeKind.Onelazy: 108case RegexNodeKind.Notoneloop: 109case RegexNodeKind.Notonelazy: 117result.AddLast(_builder.CreateLoop(_builder.CreateSingleton(bdd), node.Kind is RegexNodeKind.Onelazy or RegexNodeKind.Notonelazy, node.M, node.N)); 121case RegexNodeKind.Setloop: 122case RegexNodeKind.Setlazy: 128result.AddLast(_builder.CreateLoop(_builder.CreateSingleton(setBdd), node.Kind == RegexNodeKind.Setlazy, node.M, node.N)); 132case RegexNodeKind.Empty: 133case RegexNodeKind.UpdateBumpalong: // UpdateBumpalong is a directive relevant only to backtracking and can be ignored just like Empty 136case RegexNodeKind.Nothing: 142case RegexNodeKind.Beginning: 146case RegexNodeKind.Bol: 151case RegexNodeKind.End: // \z anchor 155case RegexNodeKind.EndZ: // \Z anchor 160case RegexNodeKind.Eol: 165case RegexNodeKind.Boundary: 170case RegexNodeKind.NonBoundary: 180RegexNodeKind.Atomic or RegexNodeKind.Setloopatomic or RegexNodeKind.Oneloopatomic or RegexNodeKind.Notoneloopatomic => SR.ExpressionDescription_AtomicSubexpressions, 181RegexNodeKind.Backreference => SR.ExpressionDescription_Backreference, 182RegexNodeKind.BackreferenceConditional => SR.ExpressionDescription_Conditional, 183RegexNodeKind.Capture => SR.ExpressionDescription_BalancingGroup, 184RegexNodeKind.ExpressionConditional => SR.ExpressionDescription_IfThenElse, 185RegexNodeKind.NegativeLookaround => SR.ExpressionDescription_NegativeLookaround, 186RegexNodeKind.PositiveLookaround => SR.ExpressionDescription_PositiveLookaround, 187RegexNodeKind.Start => SR.ExpressionDescription_ContiguousMatches, 195string description = $"Unexpected ({nameof(RegexNodeKind)}: {node.Kind})"; 211case RegexNodeKind.Concatenate: 221case RegexNodeKind.Alternate: 250case RegexNodeKind.Loop: 251case RegexNodeKind.Lazyloop: 260result.AddLast(_builder.CreateLoop(body, node.Kind == RegexNodeKind.Lazyloop, node.M, node.N)); 267Debug.Assert(node.Kind == RegexNodeKind.Capture && node.N == -1); 285Debug.Assert(rootResult.Count == 1 || root.Kind == RegexNodeKind.Concatenate || root.Kind == RegexNodeKind.Capture); 312Debug.Assert(node.Kind == RegexNodeKind.Set);
System\Text\RegularExpressions\Symbolic\SymbolicRegexKind.cs (16)
9/// <summary>An empty node that matches a zero-width input (e.g. <see cref="RegexNodeKind.Empty"/>).</summary> 11/// <summary>A node that matches a single character (i.e. <see cref="RegexNodeKind.One"/>, <see cref="RegexNodeKind.Notone"/>, or <see cref="RegexNodeKind.Set"/>).</summary> 13/// <summary>A node that matches a sequence of nodes (i.e. <see cref="RegexNodeKind.Concatenate"/>).</summary> 15/// <summary>A node that matches a loop (e.g. <see cref="RegexNodeKind.Loop"/>, <see cref="RegexNodeKind.Lazyloop"/>, <see cref="RegexNodeKind.Setloop"/>, etc.).</summary> 17/// <summary>A node that matches if any of its nodes match and that matches them in a fixed order that mirrors how the backtracking engines operate (e.g. <see cref="RegexNodeKind.Alternate"/>).</summary> 20/// <summary>A node that represents a beginning anchor (i.e. <see cref="RegexNodeKind.Beginning"/>).</summary> 22/// <summary>A node that represents an ending anchor (i.e. <see cref="RegexNodeKind.End"/>).</summary> 24/// <summary>A node that represents an ending \Z anchor (i.e. <see cref="RegexNodeKind.EndZ"/>).</summary> 28/// <summary>A node that represents a beginning-of-line anchor (i.e. <see cref="RegexNodeKind.Bol"/>).</summary> 30/// <summary>A node that represents a end-of-line anchor (i.e. <see cref="RegexNodeKind.Eol"/>).</summary> 32/// <summary>A node that represents a word boundary anchor (i.e. <see cref="RegexNodeKind.Boundary"/>).</summary> 34/// <summary>A node that represents a word non-boundary anchor (i.e. <see cref="RegexNodeKind.NonBoundary"/>).</summary>
System\Text\RegularExpressions\Symbolic\SymbolicRegexMatcher.cs (1)
211findOptimizations.LeadingAnchor is not RegexNodeKind.Beginning)