90 instantiations of RegexNode
System.Text.RegularExpressions (90)
System\Text\RegularExpressions\RegexCompiler.cs (3)
2057
new
RegexNode
(RegexNodeKind.Empty, child.Options));
2097
new
(RegexNodeKind.One, multi.Options, multi.Str[1]) :
2098
new
(RegexNodeKind.Multi, multi.Options, multi.Str.Substring(1));
System\Text\RegularExpressions\RegexNode.cs (27)
95
new
RegexNode
(Kind, Options, Str!) :
96
new
RegexNode
(Kind, Options, Ch);
121
return new
RegexNode
(RegexNodeKind.One, options & ~RegexOptions.IgnoreCase, ch);
127
return new
RegexNode
(RegexNodeKind.Set, options & ~RegexOptions.IgnoreCase, stringSet);
131
return new
RegexNode
(RegexNodeKind.One, options, ch);
207
RegexNode loopAsChild =
new
(RegexNodeKind.Loop, Options, M, N);
428
parent.InsertChild(1, new
RegexNode
(RegexNodeKind.UpdateBumpalong, node.Options));
501
var atomic = new
RegexNode
(RegexNodeKind.Atomic, existingChild.Options);
615
0 => new
RegexNode
(Kind == RegexNodeKind.Alternate ? RegexNodeKind.Nothing : RegexNodeKind.Empty, Options),
706
return new
RegexNode
(RegexNodeKind.Empty, child.Options);
896
return new
RegexNode
(RegexNodeKind.Nothing, Options);
935
u = u.M == 0 ? new
RegexNode
(RegexNodeKind.Empty, Options) : child;
1023
return new
RegexNode
(RegexNodeKind.Nothing, Options);
1245
var newAlternate = new
RegexNode
(RegexNodeKind.Alternate, alternation.Options);
1256
newAlternate.AddChild(new
RegexNode
(RegexNodeKind.Empty, children[i].Options));
1263
var atomic = new
RegexNode
(RegexNodeKind.Atomic, alternation.Options);
1270
var newConcat = new
RegexNode
(RegexNodeKind.Concatenate, alternation.Options);
1421
new
RegexNode
(RegexNodeKind.One, startingNodeOptions, startingSpan[0]) :
1422
new
RegexNode
(RegexNodeKind.Multi, startingNodeOptions, startingSpan.ToString());
1423
var newAlternate = new
RegexNode
(RegexNodeKind.Alternate, startingNodeOptions);
1467
var atomic = new
RegexNode
(RegexNodeKind.Atomic, startingNodeOptions);
1472
var newConcat = new
RegexNode
(RegexNodeKind.Concatenate, startingNodeOptions);
1690
return new
RegexNode
(RegexNodeKind.Empty, Options);
2292
AddChild(new
RegexNode
(RegexNodeKind.Empty, Options));
2310
AddChild(new
RegexNode
(RegexNodeKind.Empty, Options));
3154
return new
RegexNode
(RegexNodeKind.Empty, Options);
3182
var result = new
RegexNode
(lazy ? RegexNodeKind.Lazyloop : RegexNodeKind.Loop, Options, min, max);
System\Text\RegularExpressions\RegexParser.cs (60)
277
StartGroup(new
RegexNode
(RegexNodeKind.Capture, (_options & ~RegexOptions.IgnoreCase), 0, -1));
347
_unit = new
RegexNode
(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, setString);
400
_unit = new
RegexNode
((_options & RegexOptions.Multiline) != 0 ? RegexNodeKind.Bol : RegexNodeKind.Beginning, _options);
411
_unit = new
RegexNode
((_options & RegexOptions.Multiline) != 0 ? RegexNodeKind.Eol : RegexNodeKind.EndZ, _options);
418
_unit = new
RegexNode
(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, RegexCharClass.AnyClass);
422
_unit = new
RegexNode
(RegexNodeKind.Set, _options & ~RegexOptions.IgnoreCase, RegexCharClass.NotAnyNewLineClass);
426
_unit = new
RegexNode
(RegexNodeKind.Notone, _options & ~RegexOptions.IgnoreCase, '\n');
544
_concatenation = new
RegexNode
(RegexNodeKind.Concatenate, _options);
829
return new
RegexNode
(RegexNodeKind.Group, _options);
833
return new
RegexNode
(RegexNodeKind.Capture, _options, _autocap++, -1);
1007
return new
RegexNode
(RegexNodeKind.Capture, _options, capnum, uncapnum);
1029
return new
RegexNode
(RegexNodeKind.BackreferenceConditional, _options, capnum);
1043
return new
RegexNode
(RegexNodeKind.BackreferenceConditional, _options, tmpCapnum);
1096
return new
RegexNode
(nodeType, _options);
1160
new
RegexNode
(TypeFromCode(ch), _options);
1165
(_options & RegexOptions.AnyNewLine) != 0 ? AnyNewLineEndZNode() : new
RegexNode
(RegexNodeKind.EndZ, _options);
1170
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMAWordClass : RegexCharClass.WordClass);
1175
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMAWordClass : RegexCharClass.NotWordClass);
1180
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMASpaceClass : RegexCharClass.SpaceClass);
1185
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMASpaceClass : RegexCharClass.NotSpaceClass);
1190
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.ECMADigitClass : RegexCharClass.DigitClass);
1195
new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), (_options & RegexOptions.ECMAScript) != 0 ? RegexCharClass.NotECMADigitClass : RegexCharClass.NotDigitClass);
1212
return new
RegexNode
(RegexNodeKind.Set, (_options & ~RegexOptions.IgnoreCase), cc.ToStringClass());
1277
IsCaptureSlot(capnum) ? new
RegexNode
(RegexNodeKind.Backreference, _options, capnum) :
1309
return scanOnly ? null : new
RegexNode
(RegexNodeKind.Backreference, _options, capnum);
1323
return new
RegexNode
(RegexNodeKind.Backreference, _options, capnum);
1343
_capnames?[capname] is int tmpCapnum ? new
RegexNode
(RegexNodeKind.Backreference, _options, tmpCapnum) :
1419
return new
RegexNode
(RegexNodeKind.Backreference, _options, capnum);
1429
return new
RegexNode
(RegexNodeKind.Backreference, _options, capnum);
1441
return new
RegexNode
(RegexNodeKind.Backreference, _options, tmpCapnum);
1479
return new
RegexNode
(RegexNodeKind.Backreference, _options, capnum);
1740
var lookbehindCr = new
RegexNode
(RegexNodeKind.PositiveLookaround, lookbehindOpts);
1741
lookbehindCr.AddChild(new
RegexNode
(RegexNodeKind.One, lookbehindOptsNoCase, '\r'));
1744
var crThenLf = new
RegexNode
(RegexNodeKind.Concatenate, lookaheadOpts);
1746
crThenLf.AddChild(new
RegexNode
(RegexNodeKind.One, lookaheadOptsNoCase, '\n'));
1749
var guard = new
RegexNode
(RegexNodeKind.NegativeLookaround, lookaheadOpts);
1768
var crlfEnd = new
RegexNode
(RegexNodeKind.Concatenate, lookaheadOpts);
1769
crlfEnd.AddChild(new
RegexNode
(RegexNodeKind.One, lookaheadOptsNoCase, '\r'));
1770
crlfEnd.AddChild(new
RegexNode
(RegexNodeKind.One, lookaheadOptsNoCase, '\n'));
1771
crlfEnd.AddChild(new
RegexNode
(RegexNodeKind.End, lookaheadOpts));
1774
var anyNewLineOptEnd = new
RegexNode
(RegexNodeKind.Concatenate, lookaheadOpts);
1775
anyNewLineOptEnd.AddChild(new
RegexNode
(RegexNodeKind.Set, lookaheadOptsNoCase, RegexCharClass.AnyNewLineClass).MakeQuantifier(false, 0, 1));
1776
anyNewLineOptEnd.AddChild(new
RegexNode
(RegexNodeKind.End, lookaheadOpts));
1779
var innerAlt = new
RegexNode
(RegexNodeKind.Alternate, lookaheadOpts);
1782
var lookahead = new
RegexNode
(RegexNodeKind.PositiveLookaround, lookaheadOpts);
1786
var result = new
RegexNode
(RegexNodeKind.Concatenate, opts);
1805
var innerAlt = new
RegexNode
(RegexNodeKind.Alternate, lookaheadOpts);
1806
innerAlt.AddChild(new
RegexNode
(RegexNodeKind.Set, lookaheadOptsNoCase, RegexCharClass.AnyNewLineClass));
1807
innerAlt.AddChild(new
RegexNode
(RegexNodeKind.End, lookaheadOpts));
1808
var lookahead = new
RegexNode
(RegexNodeKind.PositiveLookaround, lookaheadOpts);
1812
var result = new
RegexNode
(RegexNodeKind.Concatenate, opts);
1831
var innerAlt = new
RegexNode
(RegexNodeKind.Alternate, lookbehindOpts);
1832
innerAlt.AddChild(new
RegexNode
(RegexNodeKind.Set, lookbehindOptsNoCase, RegexCharClass.AnyNewLineClass));
1833
innerAlt.AddChild(new
RegexNode
(RegexNodeKind.Beginning, lookbehindOpts));
1834
var lookbehind = new
RegexNode
(RegexNodeKind.PositiveLookaround, lookbehindOpts);
1838
var result = new
RegexNode
(RegexNodeKind.Concatenate, opts);
2197
_concatenation!.AddChild(new
RegexNode
(RegexNodeKind.Multi, _options & ~RegexOptions.IgnoreCase, _pattern.Substring(pos, cch)));
2243
_alternation = new
RegexNode
(RegexNodeKind.Alternate, _options);
2244
_concatenation = new
RegexNode
(RegexNodeKind.Concatenate, _options);
2261
_concatenation = new
RegexNode
(RegexNodeKind.Concatenate, _options);
345 references to RegexNode
System.Text.RegularExpressions (345)
System\Text\RegularExpressions\RegexCompiler.cs (61)
1272
(
RegexNode
LoopNode, (char Char, string? String, StringComparison StringComparison, char[]? Chars) Literal) target = _regexTree.FindOptimizations.LiteralAfterLoop.Value;
1456
RegexNode
node = _regexTree.Root;
1671
void EmitAlternation(
RegexNode
node)
1890
bool TryEmitAlternationAsSwitch(
RegexNode
node, int childCount, bool isAtomic)
1930
void EmitSwitchedBranches(
RegexNode
node, int childCount, bool useILSwitch, int minValue, int range)
1946
RegexNode
child = node.Child(i);
1947
RegexNode
? startingLiteralNode = child.FindStartingLiteralNode(allowZeroWidth: false);
2026
RegexNode
child = node.Child(i);
2027
RegexNode
? startingLiteralNode = child.FindStartingLiteralNode(allowZeroWidth: false);
2053
RegexNode
originalFirst = child.Child(0);
2093
static
RegexNode
CreateSlicedMulti(
RegexNode
multi)
2103
void EmitBackreference(
RegexNode
node)
2293
void EmitBackreferenceConditional(
RegexNode
node)
2308
RegexNode
yesBranch = node.Child(0);
2309
RegexNode
? noBranch = node.Child(1) is { Kind: not RegexNodeKind.Empty } childNo ? childNo : null;
2452
void EmitExpressionConditional(
RegexNode
node)
2465
RegexNode
condition = node.Child(0);
2469
RegexNode
yesBranch = node.Child(1);
2470
RegexNode
? noBranch = node.Child(2) is { Kind: not RegexNodeKind.Empty } childNo ? childNo : null;
2645
void EmitCapture(
RegexNode
node,
RegexNode
? subsequent = null)
2664
RegexNode
child = node.Child(0);
2771
void EmitPositiveLookaroundAssertion(
RegexNode
node)
2815
void EmitNegativeLookaroundAssertion(
RegexNode
node)
2847
RegexNode
child = node.Child(0);
2932
void EmitNode(
RegexNode
node,
RegexNode
? subsequent = null, bool emitLengthChecksIfRequired = true)
3074
void EmitAtomic(
RegexNode
node,
RegexNode
? subsequent)
3079
RegexNode
child = node.Child(0);
3118
void EmitUpdateBumpalong(
RegexNode
node)
3138
void EmitConcatenation(
RegexNode
node,
RegexNode
? subsequent, bool emitLengthChecksIfRequired)
3192
static
RegexNode
? GetSubsequent(int index,
RegexNode
node,
RegexNode
? subsequent)
3197
RegexNode
next = node.Child(i);
3209
void EmitSingleChar(
RegexNode
node, bool emitLengthCheck = true, LocalBuilder? offset = null)
3284
void EmitBoundary(
RegexNode
node)
3344
void EmitAnchors(
RegexNode
node)
3482
void EmitMultiChar(
RegexNode
node, bool emitLengthCheck)
3534
void EmitSingleCharLoop(
RegexNode
node,
RegexNode
? subsequent = null, bool emitLengthChecksIfRequired = true)
3655
subsequent?.FindStartingLiteralNode() is
RegexNode
literal &&
3750
void EmitSingleCharLazy(
RegexNode
node,
RegexNode
? subsequent = null, bool emitLengthChecksIfRequired = true)
3854
subsequent?.FindStartingLiteral() is
RegexNode
.StartingLiteralData literal &&
3996
subsequent?.FindStartingLiteralNode() is
RegexNode
literal2 &&
4097
void EmitLazy(
RegexNode
node)
4104
RegexNode
child = node.Child(0);
4459
void EmitSingleCharRepeater(
RegexNode
node, bool emitLengthChecksIfRequired = true)
4477
case <=
RegexNode
.MultiVsRepeaterLimit when node.IsOneFamily:
4608
void EmitSingleCharAtomicLoop(
RegexNode
node)
4855
void EmitAtomicSingleCharZeroOrOne(
RegexNode
node)
4944
void EmitNonBacktrackingRepeater(
RegexNode
node)
4982
void EmitLoop(
RegexNode
node)
4988
RegexNode
child = node.Child(0);
5380
bool CanEmitIndexOf(
RegexNode
node, out int literalLength)
5413
void EmitIndexOf(
RegexNode
node, bool useLast, bool negate)
5605
RegexNode
root = _regexTree!.Root.Child(0);
System\Text\RegularExpressions\RegexFindOptimizations.cs (6)
18
public static RegexFindOptimizations Create(
RegexNode
root, RegexOptions options)
24
RegexPrefixAnalyzer.FindLeadingPositiveLookahead(root) is
RegexNode
positiveLookahead)
46
private RegexFindOptimizations(
RegexNode
root, RegexOptions options, bool isLeadingPartial)
202
(
RegexNode
LoopNode, (char Char, string? String, StringComparison StringComparison, char[]? Chars) Literal)? literalAfterLoop = RegexPrefixAnalyzer.FindLiteralFollowingLeadingLoop(root);
336
public (
RegexNode
LoopNode, (char Char, string? String, StringComparison StringComparison, char[]? Chars) Literal)? LiteralAfterLoop { get; }
820
(
RegexNode
loopNode, (char Char, string? String, StringComparison StringComparison, char[]? Chars) literal) = LiteralAfterLoop.GetValueOrDefault();
System\Text\RegularExpressions\RegexNode.cs (137)
19
/// <remarks>null if no children, a <see cref="
RegexNode
"/> if one child, or a <see cref="List{RegexNode}"/> if multiple children.</remarks>
49
public
RegexNode
? Parent;
87
public
RegexNode
CloneCharLoopWithOneLessIteration()
94
RegexNode
newNode = IsSetFamily ?
110
public static
RegexNode
CreateOneWithCaseConversion(char ch, RegexOptions options, CultureInfo? culture, ref RegexCaseBehavior caseBehavior)
135
public
RegexNode
ReverseConcatenationIfRightToLeft()
141
((List<
RegexNode
>)Children!).Reverse();
207
RegexNode
loopAsChild = new(RegexNodeKind.Loop, Options, M, N);
245
var toExamine = new Stack<
RegexNode
>();
249
RegexNode
node = toExamine.Pop();
255
RegexNode
child = node.Child(i);
369
internal
RegexNode
FinalOptimize()
371
RegexNode
rootNode = this;
409
RegexNode
node = rootNode.Child(0); // skip implicit root capture node
462
RegexNode
node = this;
497
RegexNode
existingChild = node.Child(node.ChildCount() - 1);
501
var
atomic = new RegexNode(RegexNodeKind.Atomic, existingChild.Options);
574
internal
RegexNode
Reduce()
610
private
RegexNode
ReplaceNodeIfUnnecessary()
627
private
RegexNode
ReduceGroup()
631
RegexNode
u = this;
648
private
RegexNode
ReduceAtomic()
660
RegexNode
atomic = this;
661
RegexNode
child = Child(0);
698
List<
RegexNode
>? branches = child.Children as List<
RegexNode
>;
739
RegexNode
startNode = branches[start];
775
RegexNode
nextChild = branches[next];
824
private
RegexNode
ReduceLoops()
828
RegexNode
u = this;
836
RegexNode
child = u.Child(0);
904
RegexNode
child = u.Child(0);
955
private
RegexNode
ReduceSet()
1016
private
RegexNode
ReduceAlternation()
1030
RegexNode
node = ReplaceNodeIfUnnecessary();
1075
RegexNode
at;
1076
RegexNode
prev;
1078
List<
RegexNode
> children = (List<
RegexNode
>)Children!;
1090
if (at.Children is List<
RegexNode
> atChildren)
1100
RegexNode
atChild = (
RegexNode
)at.Children!;
1184
static
RegexNode
ExtractCommonPrefixNode(
RegexNode
alternation)
1187
Debug.Assert(alternation.Children is List<
RegexNode
> { Count: >= 2 });
1188
var children = (List<
RegexNode
>)alternation.Children;
1204
RegexNode
startingNode = children[startingIndex];
1205
RegexNode
required = startingNode.Kind == RegexNodeKind.Concatenate ? startingNode.Child(0) : startingNode;
1225
RegexNode
endingNode = children[endingIndex];
1226
RegexNode
other = endingNode.Kind == RegexNodeKind.Concatenate ? endingNode.Child(0) : endingNode;
1245
var
newAlternate = new RegexNode(RegexNodeKind.Alternate, alternation.Options);
1250
((List<
RegexNode
>)children[i].Children!).RemoveAt(0);
1261
if (alternation.Parent is
RegexNode
{ Kind: RegexNodeKind.Atomic })
1263
var
atomic = new RegexNode(RegexNodeKind.Atomic, alternation.Options);
1270
var
newConcat = new RegexNode(RegexNodeKind.Concatenate, alternation.Options);
1284
static
RegexNode
RemoveRedundantEmptiesAndNothings(
RegexNode
node)
1288
var children = (List<
RegexNode
>)node.Children!;
1294
RegexNode
child = children[i];
1327
static
RegexNode
ExtractCommonPrefixText(
RegexNode
alternation)
1330
Debug.Assert(alternation.Children is List<
RegexNode
> { Count: >= 2 });
1331
var children = (List<
RegexNode
>)alternation.Children;
1348
RegexNode
? startingNode = children[startingIndex].FindBranchOneOrMultiStart();
1420
var
prefix = startingSpan.Length == 1 ?
1423
var
newAlternate = new RegexNode(RegexNodeKind.Alternate, startingNodeOptions);
1426
RegexNode
branch = children[i];
1433
static void ProcessOneOrMulti(
RegexNode
node, ReadOnlySpan<char> startingSpan)
1465
if (alternation.Parent is
RegexNode
parent && parent.Kind == RegexNodeKind.Atomic)
1467
var
atomic = new RegexNode(RegexNodeKind.Atomic, startingNodeOptions);
1472
var
newConcat = new RegexNode(RegexNodeKind.Concatenate, startingNodeOptions);
1490
public
RegexNode
? FindBranchOneOrMultiStart()
1492
RegexNode
branch = Kind == RegexNodeKind.Concatenate ? Child(0) : this;
1529
if (Child(i).FindStartingLiteralNode(allowZeroWidth: false) is not
RegexNode
startingLiteralNode ||
1575
public
RegexNode
? FindStartingLiteralNode(bool allowZeroWidth = true)
1577
RegexNode
? node = this;
1615
if (FindStartingLiteralNode() is
RegexNode
node)
1682
private
RegexNode
ReduceConcatenation()
1699
RegexNode
child = Child(i);
1727
Debug.Assert(Children is List<
RegexNode
>);
1733
List<
RegexNode
> children = (List<
RegexNode
>)Children!;
1736
RegexNode
at = children[i];
1746
if (at.Children is List<
RegexNode
> atChildren)
1756
RegexNode
atChild = (
RegexNode
)at.Children!;
1774
RegexNode
prev = children[--j];
1810
Debug.Assert(Children is List<
RegexNode
>);
1812
var children = (List<
RegexNode
>)Children!;
1817
RegexNode
currentNode = children[current];
1818
RegexNode
nextNode = children[next];
2018
Debug.Assert(Children is List<
RegexNode
>);
2019
var children = (List<
RegexNode
>)Children;
2024
static void ProcessNode(
RegexNode
node,
RegexNode
subsequent)
2086
RegexNode
loopChild = node.Child(0);
2120
RegexNode
child = node.Child(0);
2130
RegexNode
child = node.Child(0);
2161
private
RegexNode
ReduceLookaround()
2180
static bool RemoveCaptures(
RegexNode
parent, int nodeIndex)
2182
RegexNode
node = parent.Child(nodeIndex);
2212
RegexNode
child = Child(0);
2251
private static bool? ContainsKind(
RegexNode
node, ReadOnlySpan<RegexNodeKind> kinds)
2281
private
RegexNode
ReduceBackreferenceConditional()
2299
private
RegexNode
ReduceExpressionConditional()
2318
RegexNode
condition = Child(0);
2337
private static bool CanBeMadeAtomic(
RegexNode
node,
RegexNode
subsequent, bool iterateNullableSubsequent, bool allowLazy)
2502
RegexNode
loopChild = node.Child(0);
2557
RegexNode
? parent = subsequent.Parent;
2567
var peers = (List<
RegexNode
>)parent.Children!;
2614
private static bool MayContainBacktracking(
RegexNode
node)
2650
RegexNode
node = this;
2657
node.Parent is not
RegexNode
parent)
2671
var peers = (List<
RegexNode
>)parent.Children!;
2979
RegexNode
child = Child(i);
3106
static bool CanJoinLengthCheck(
RegexNode
node) => node.Kind switch
3117
RegexNode
child = Child(childIndex);
3145
public
RegexNode
MakeQuantifier(bool lazy, int min, int max)
3182
var
result = new RegexNode(lazy ? RegexNodeKind.Lazyloop : RegexNodeKind.Loop, Options, min, max);
3188
public void AddChild(
RegexNode
newChild)
3198
else if (Children is
RegexNode
currentChild)
3200
Children = new List<
RegexNode
>() { currentChild, newChild };
3204
((List<
RegexNode
>)Children).Add(newChild);
3208
public void InsertChild(int index,
RegexNode
newChild)
3210
Debug.Assert(Children is List<
RegexNode
>);
3216
((List<
RegexNode
>)Children).Insert(index, newChild);
3219
public void ReplaceChild(int index,
RegexNode
newChild)
3228
if (Children is
RegexNode
)
3234
((List<
RegexNode
>)Children)[index] = newChild;
3238
public
RegexNode
Child(int i) => Children is
RegexNode
child ? child : ((List<
RegexNode
>)Children!)[i];
3247
if (Children is List<
RegexNode
> children)
3252
Debug.Assert(Children is
RegexNode
);
3283
static bool ExceedsMaxDepthAllowedDepth(
RegexNode
node, int allowedDepth)
3317
RegexNode
? curNode = this;
System\Text\RegularExpressions\RegexNodeKind.cs (42)
6
/// <summary>Specifies the kind of a <see cref="
RegexNode
"/>.</summary>
16
/// <remarks>The character is specified in <see cref="
RegexNode
.Ch"/>.</remarks>
19
/// <remarks>The character is specified in <see cref="
RegexNode
.Ch"/>.</remarks>
22
/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="
RegexNode
.Str"/>.</remarks>
26
/// <remarks>The characters are specified in <see cref="
RegexNode
.Str"/>. This is purely a representational optimization, equivalent to multiple <see cref="One"/> nodes concatenated together.</remarks>
31
/// The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.
36
/// <remarks>The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.</remarks>
40
/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="
RegexNode
.Str"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.</remarks>
45
/// <remarks>The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.</remarks>
49
/// <remarks>The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.</remarks>
53
/// <remarks>The <see cref="RegexCharClass"/> set string is specified in <see cref="
RegexNode
.Str"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.</remarks>
59
/// The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.
65
/// The character is specified in <see cref="
RegexNode
.Ch"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.
71
/// The <see cref="RegexCharClass"/> set string is specified in <see cref="
RegexNode
.Str"/>, the minimum number of iterations in <see cref="
RegexNode
.M"/>, and the maximum number of iterations in <see cref="
RegexNode
.N"/>.
77
/// <remarks>The capture group number referenced is stored in <see cref="
RegexNode
.M"/>.</remarks>
126
/// <summary>A loop around an arbitrary <see cref="
RegexNode
"/>, e.g. `(ab|cd)*`.</summary>
128
/// One and only one child, the expression in the loop. The minimum number of iterations is in <see cref="
RegexNode
.M"/>,
129
/// and the maximum number of iterations is in <see cref="
RegexNode
.N"/>.
132
/// <summary>A lazy loop around an arbitrary <see cref="
RegexNode
"/>, e.g. `(ab|cd)*?`.</summary>
134
/// One and only one child, the expression in the loop. The minimum number of iterations is in <see cref="
RegexNode
.M"/>,
135
/// and the maximum number of iterations is in <see cref="
RegexNode
.N"/>.
141
/// One and only one child, the expression in the capture. <see cref="
RegexNode
.M"/> is the number of the capture, and if a balancing
142
/// group, <see cref="
RegexNode
.N"/> is the uncapture.
169
/// The referenced capture group number is stored in <see cref="
RegexNode
.M"/>.
System\Text\RegularExpressions\RegexOpcode.cs (1)
151
/// For quantified constructs with a minimum of zero (<see cref="
RegexNode
.M"/> == 0), this opcode pushes a counter
System\Text\RegularExpressions\RegexParser.cs (41)
24
private
RegexNode
? _stack;
25
private
RegexNode
? _group;
26
private
RegexNode
? _alternation;
27
private
RegexNode
? _concatenation;
28
private
RegexNode
? _unit;
109
RegexNode
root = parser.ScanRegex();
144
RegexNode
root = parser.ScanReplacement();
270
private
RegexNode
ScanRegex()
332
_unit =
RegexNode
.CreateOneWithCaseConversion(_pattern[endpos - 1], _options, _culture, ref _caseBehavior);
353
if (ScanGroupOpen() is
RegexNode
grouper)
542
private
RegexNode
ScanReplacement()
818
private
RegexNode
? ScanGroupOpen()
1146
private
RegexNode
? ScanBackslash(bool scanOnly)
1215
RegexNode
? result = ScanBasicBackslash(scanOnly);
1225
private
RegexNode
? ScanBasicBackslash(bool scanOnly)
1354
RegexNode
.CreateOneWithCaseConversion(ch, _options, _culture, ref _caseBehavior) :
1359
private
RegexNode
ScanDollar()
1363
return
RegexNode
.CreateOneWithCaseConversion('$', _options, _culture, ref _caseBehavior);
1453
return
RegexNode
.CreateOneWithCaseConversion('$', _options, _culture, ref _caseBehavior);
1486
return
RegexNode
.CreateOneWithCaseConversion('$', _options, _culture, ref _caseBehavior);
1732
private
RegexNode
AnyNewLineCrLfGuardNode()
1740
var
lookbehindCr = new RegexNode(RegexNodeKind.PositiveLookaround, lookbehindOpts);
1744
var
crThenLf = new RegexNode(RegexNodeKind.Concatenate, lookaheadOpts);
1749
var
guard = new RegexNode(RegexNodeKind.NegativeLookaround, lookaheadOpts);
1761
private
RegexNode
AnyNewLineEndZNode()
1768
var
crlfEnd = new RegexNode(RegexNodeKind.Concatenate, lookaheadOpts);
1774
var
anyNewLineOptEnd = new RegexNode(RegexNodeKind.Concatenate, lookaheadOpts);
1779
var
innerAlt = new RegexNode(RegexNodeKind.Alternate, lookaheadOpts);
1782
var
lookahead = new RegexNode(RegexNodeKind.PositiveLookaround, lookaheadOpts);
1786
var
result = new RegexNode(RegexNodeKind.Concatenate, opts);
1798
private
RegexNode
AnyNewLineEolNode()
1805
var
innerAlt = new RegexNode(RegexNodeKind.Alternate, lookaheadOpts);
1808
var
lookahead = new RegexNode(RegexNodeKind.PositiveLookaround, lookaheadOpts);
1812
var
result = new RegexNode(RegexNodeKind.Concatenate, opts);
1824
private
RegexNode
AnyNewLineBolNode()
1831
var
innerAlt = new RegexNode(RegexNodeKind.Alternate, lookbehindOpts);
1834
var
lookbehind = new RegexNode(RegexNodeKind.PositiveLookaround, lookbehindOpts);
1838
var
result = new RegexNode(RegexNodeKind.Concatenate, opts);
2193
_concatenation!.AddChild(
RegexNode
.CreateOneWithCaseConversion(_pattern[pos], isReplacement ? _options & ~RegexOptions.IgnoreCase : _options, _culture, ref _caseBehavior));
2203
_concatenation!.AddChild(
RegexNode
.CreateOneWithCaseConversion(c, _options, _culture, ref _caseBehavior));
2240
private void StartGroup(
RegexNode
openGroup)
System\Text\RegularExpressions\RegexPrefixAnalyzer.cs (25)
21
public static string[]? FindPrefixes(
RegexNode
node, bool ignoreCase)
57
static bool FindPrefixesCore(
RegexNode
node, List<StringBuilder> results, bool ignoreCase)
340
public static string FindPrefix(
RegexNode
node)
348
static bool Process(
RegexNode
node, ref ValueStringBuilder vsb)
483
public static string? FindPrefixOrdinalCaseInsensitive(
RegexNode
node)
511
public static List<RegexFindOptimizations.FixedDistanceSet>? FindFixedDistanceSets(
RegexNode
root, bool thorough)
586
static bool TryFindRawFixedSets(
RegexNode
node, List<RegexFindOptimizations.FixedDistanceSet> results, ref int distance, bool thorough)
906
public static string? FindFirstCharClass(
RegexNode
root) => FindFirstOrLastCharClass(root, findFirst: true);
911
public static string? FindLastCharClass(
RegexNode
root) => FindFirstOrLastCharClass(root, findFirst: false);
913
public static string? FindFirstOrLastCharClass(
RegexNode
root, bool findFirst)
942
static bool? TryFindFirstOrLastCharClass(
RegexNode
node, bool findFirst, ref RegexCharClass? cc)
1127
public static (
RegexNode
LoopNode, (char Char, string? String, StringComparison StringComparison, char[]? Chars) Literal)? FindLiteralFollowingLeadingLoop(
RegexNode
node)
1154
RegexNode
firstChild = node.Child(0);
1166
RegexNode
nextChild = node.Child(1);
1256
public static
RegexNode
? FindLeadingPositiveLookahead(
RegexNode
node)
1258
RegexNode
? positiveLookahead = null;
1263
static bool FindLeadingPositiveLookahead(
RegexNode
node, ref
RegexNode
? positiveLookahead)
1330
public static RegexNodeKind FindLeadingAnchor(
RegexNode
node) =>
1334
public static RegexNodeKind FindTrailingAnchor(
RegexNode
node) =>
1338
private static RegexNodeKind FindLeadingOrTrailingAnchor(
RegexNode
node, bool leading)
1379
RegexNode
? child = null;
1385
RegexNode
tmpChild = node.Child(i);
System\Text\RegularExpressions\RegexReplacement.cs (2)
34
public RegexReplacement(string rep,
RegexNode
concat, Hashtable _caps)
46
RegexNode
child = concat.Child(i);
System\Text\RegularExpressions\RegexTree.cs (4)
11
/// Provides the core data describing a parsed <see cref="
RegexNode
"/> tree, along with necessary
18
/// <summary>The root node of the parsed <see cref="
RegexNode
"/> tree.</summary>
19
public readonly
RegexNode
Root;
43
internal RegexTree(
RegexNode
root, int captureCount, string[]? captureNames, Hashtable? captureNameToNumberMapping, Hashtable? captureNumberSparseMapping, RegexOptions options, CultureInfo? culture)
System\Text\RegularExpressions\RegexTreeAnalyzer.cs (14)
9
/// <summary>Analyzes a <see cref="RegexTree"/> of <see cref="
RegexNode
"/>s to produce data on the tree structure, in particular in support of code generation.</summary>
19
static bool TryAnalyze(
RegexNode
node, AnalysisResults results, bool isAtomicByAncestor, bool isInLoop)
33
(results._inLoops ??= new HashSet<
RegexNode
>()).Add(node);
49
(results._mayBacktrack ??= new HashSet<
RegexNode
>()).Add(node);
81
RegexNode
child = node.Child(i);
131
(results._mayBacktrack ??= new HashSet<
RegexNode
>()).Add(node);
154
internal readonly HashSet<
RegexNode
> _isAtomicByAncestor = new(); // since the root is implicitly atomic, every tree will contain atomic-by-ancestor nodes
156
internal readonly HashSet<
RegexNode
> _containsCapture = new(); // the root is a capture, so this will always contain at least the root node
158
internal HashSet<
RegexNode
>? _mayBacktrack;
160
internal HashSet<
RegexNode
>? _inLoops;
179
public bool IsAtomicByAncestor(
RegexNode
node) => _isAtomicByAncestor.Contains(node);
187
public bool MayContainCapture(
RegexNode
node) => !_complete || _containsCapture.Contains(node);
200
public bool MayBacktrack(
RegexNode
node) => !_complete || (_mayBacktrack?.Contains(node) ?? false);
220
public bool IsInLoop(
RegexNode
node) => !_complete || (_inLoops?.Contains(node) ?? false);
System\Text\RegularExpressions\RegexWriter.cs (2)
78
RegexNode
curNode = _tree.Root;
201
private void EmitFragment(RegexNodeKind nodeType,
RegexNode
node, int curIndex)
System\Text\RegularExpressions\Symbolic\DoublyLinkedList.cs (2)
14
/// <see cref="AddLast(DoublyLinkedList{T})"/> operation is made use of in the <see cref="RegexNodeConverter.ConvertToSymbolicRegexNode(
RegexNode
)"/> method
15
/// where it maintains linear construction time in terms of the overall number of AST nodes in a given <see cref="
RegexNode
"/> input.
System\Text\RegularExpressions\Symbolic\RegexNodeConverter.cs (8)
13
/// <summary>Provides functionality to convert <see cref="
RegexNode
"/>s to corresponding <see cref="SymbolicRegexNode{S}"/>s.</summary>
26
/// <summary>Converts the root <see cref="
RegexNode
"/> into its corresponding <see cref="SymbolicRegexNode{S}"/>.</summary>
29
internal SymbolicRegexNode<BDD> ConvertToSymbolicRegexNode(
RegexNode
root)
37
Stack<(
RegexNode
Node, DoublyLinkedList<SymbolicRegexNode<BDD>> Result, DoublyLinkedList<SymbolicRegexNode<BDD>>[]? ChildResults)> stack = new();
42
while (stack.TryPop(out (
RegexNode
Node, DoublyLinkedList<SymbolicRegexNode<BDD>> Result, DoublyLinkedList<SymbolicRegexNode<BDD>>[]? ChildResults) popped))
44
RegexNode
node = popped.Node;
191
static string UnexpectedNodeType(
RegexNode
node)
310
SymbolicRegexNode<BDD> ConvertSet(
RegexNode
node)