Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ ReduceAlternation()

RegexNode System.Text.RegularExpressions.RegexNode.ReduceAlternation ( )
inlineprivate

Definition at line 401 of file RegexNode.cs.

402 {
403 switch (ChildCount())
404 {
405 case 0:
406 return new RegexNode(22, Options);
407 case 1:
408 return Child(0);
409 default:
410 {
413 if (regexNode == this)
414 {
415 return ExtractCommonPrefix();
416 }
417 return regexNode;
418 }
419 }
421 {
423 if ((Options & RegexOptions.RightToLeft) != 0)
424 {
425 return this;
426 }
428 if (regexNode2 == null)
429 {
430 return this;
431 }
432 RegexOptions options = regexNode2.Options;
433 string str = regexNode2.Str;
435 if (regexNode2.Type == 9)
436 {
437 Span<char> span = stackalloc char[1] { regexNode2.Ch };
439 }
440 else
441 {
443 }
445 for (int i = 1; i < list.Count; i++)
446 {
448 if (regexNode2 == null || regexNode2.Options != options)
449 {
450 return this;
451 }
452 if (regexNode2.Type == 9)
453 {
454 if (startingSpan2[0] != regexNode2.Ch)
455 {
456 return this;
457 }
458 if (startingSpan2.Length != 1)
459 {
460 startingSpan2 = startingSpan2.Slice(0, 1);
461 }
462 }
463 else
464 {
465 int num = Math.Min(startingSpan2.Length, regexNode2.Str.Length);
466 int j;
467 for (j = 0; j < num && startingSpan2[j] == regexNode2.Str[j]; j++)
468 {
469 }
470 if (j == 0)
471 {
472 return this;
473 }
474 startingSpan2 = startingSpan2.Slice(0, j);
475 }
476 }
477 for (int k = 0; k < list.Count; k++)
478 {
480 if (regexNode3.Type == 25)
481 {
483 ReplaceChild(k, regexNode3.Reduce());
484 }
485 else
486 {
488 }
489 }
490 for (int l = 0; l < list.Count; l++)
491 {
492 if (list[l].Type == 23)
493 {
494 int m = l + 1;
495 int num2 = m;
496 for (; m < list.Count; m++)
497 {
498 if (list[m].Type != 23)
499 {
500 if (num2 != m)
501 {
502 list[num2] = list[m];
503 }
504 num2++;
505 }
506 }
507 if (num2 < m)
508 {
509 list.RemoveRange(num2, m - num2);
510 }
511 break;
512 }
513 }
515 regexNode4.AddChild((startingSpan2.Length == 1) ? new RegexNode(9, options)
516 {
517 Ch = startingSpan2[0]
518 } : new RegexNode(12, options)
519 {
520 Str = ((str?.Length == startingSpan2.Length) ? str : startingSpan2.ToString())
521 });
522 regexNode4.AddChild(this);
523 return regexNode4;
524 }
526 {
527 if (branch.Type == 25)
528 {
529 branch = branch.Child(0);
530 }
531 if (branch.Type != 9 && branch.Type != 12)
532 {
533 return null;
534 }
535 return branch;
536 }
538 {
539 if (node.Type == 9)
540 {
541 node.Type = 23;
542 node.Ch = '\0';
543 }
544 else if (node.Str.Length == startingSpan.Length)
545 {
546 node.Type = 23;
547 node.Str = null;
548 }
549 else if (node.Str.Length - 1 == startingSpan.Length)
550 {
551 node.Type = 9;
552 node.Ch = node.Str[^1];
553 node.Str = null;
554 }
555 else
556 {
557 node.Str = node.Str.Substring(startingSpan.Length);
558 }
559 }
561 {
562 bool flag = false;
563 bool flag2 = false;
564 RegexOptions regexOptions = RegexOptions.None;
566 int n = 0;
567 int num3;
568 for (num3 = 0; n < list2.Count; n++, num3++)
569 {
571 if (num3 < n)
572 {
574 }
575 if (regexNode5.Type == 24)
576 {
577 if (regexNode5.Children is List<RegexNode> list3)
578 {
579 for (int num4 = 0; num4 < list3.Count; num4++)
580 {
581 list3[num4].Next = this;
582 }
583 list2.InsertRange(n + 1, list3);
584 }
585 else
586 {
588 regexNode6.Next = this;
589 list2.Insert(n + 1, regexNode6);
590 }
591 num3--;
592 }
593 else if (regexNode5.Type == 11 || regexNode5.Type == 9)
594 {
595 RegexOptions regexOptions2 = regexNode5.Options & (RegexOptions.IgnoreCase | RegexOptions.RightToLeft);
596 if (regexNode5.Type == 11)
597 {
598 if (!flag || regexOptions != regexOptions2 || flag2 || !RegexCharClass.IsMergeable(regexNode5.Str))
599 {
600 flag = true;
601 flag2 = !RegexCharClass.IsMergeable(regexNode5.Str);
603 continue;
604 }
605 }
606 else if (!flag || regexOptions != regexOptions2 || flag2)
607 {
608 flag = true;
609 flag2 = false;
611 continue;
612 }
613 num3--;
615 RegexCharClass regexCharClass;
616 if (regexNode7.Type == 9)
617 {
618 regexCharClass = new RegexCharClass();
619 regexCharClass.AddChar(regexNode7.Ch);
620 }
621 else
622 {
623 regexCharClass = RegexCharClass.Parse(regexNode7.Str);
624 }
625 if (regexNode5.Type == 9)
626 {
627 regexCharClass.AddChar(regexNode5.Ch);
628 }
629 else
630 {
631 RegexCharClass cc = RegexCharClass.Parse(regexNode5.Str);
632 regexCharClass.AddCharClass(cc);
633 }
634 regexNode7.Type = 11;
635 regexNode7.Str = regexCharClass.ToStringClass();
636 }
637 else if (regexNode5.Type == 22)
638 {
639 num3--;
640 }
641 else
642 {
643 flag = false;
644 flag2 = false;
645 }
646 }
647 if (num3 < n)
648 {
649 list2.RemoveRange(num3, n - num3);
650 }
651 }
652 }
void ReplaceChild(int index, RegexNode newChild)
RegexNode ReplaceNodeIfUnnecessary(int emptyTypeIfNoChildren)
Definition RegexNode.cs:269
RegexNode(int type, RegexOptions options)
Definition RegexNode.cs:23

References System.Text.RegularExpressions.RegexNode.RegexNode(), System.Text.RegularExpressions.RegexNode.Ch, System.Text.RegularExpressions.RegexNode.Child(), System.Text.RegularExpressions.RegexNode.ChildCount(), System.Text.RegularExpressions.RegexNode.Children, System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Text.RegularExpressions.i, System.Text.RegularExpressions.RegexCharClass.IsMergeable(), System.list, System.Math.Min(), System.Text.RegularExpressions.options, System.Text.RegularExpressions.RegexNode.Options, System.Text.RegularExpressions.RegexCharClass.Parse(), System.Text.RegularExpressions.RegexNode.ReplaceChild(), System.Text.RegularExpressions.RegexNode.ReplaceNodeIfUnnecessary(), System.Text.RegularExpressions.str, and System.Text.RegularExpressions.RegexNode.Str.

Referenced by System.Text.RegularExpressions.RegexNode.Reduce().