// ----------------------------------------------------------------------------- // file="RegexIRGenerator" // Project: StgSharp // Copyright (c) Nitload. // SPDX-License-Identifier: MIT // ----------------------------------------------------------------------------- using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace StgSharp.RegularAnalysis.Text { internal class RegexIRGenerator { private Node _head = new(); private Node _tail; public RegexIRGenerator() { _tail = _head; } public int Count { get; private set; } public void EmitCondition( int success, int fail ) { _tail.Add(new RegexConditionIR(success, fail)); Count++; } public void EmitCountComplex( int min, int max, bool isGreedy, int operation ) { _tail.Add(new RegexCountComplexIR(min, max, isGreedy, operation)); Count++; } public void EmitCountSeq( int min, int max, bool isGreedy, string seq ) { _tail.Add(new RegexCountSeqIR(min, max, isGreedy, seq)); Count++; } public void EmitCountSet( int min, int max, bool isGreedy, string set ) { _tail.Add(new RegexCountSetIR(min, max, isGreedy, set)); Count++; } public void EmitIRStream( RegexIRGenerator stream ) { if (stream is null || stream.Count == 0) { return; } _tail.Next = stream._head; _tail = stream._tail; Count += stream.Count; } public void EmitMatchSeq( string unit ) { _tail.Add(new RegexMatchSeqIR(unit)); Count++; } public void EmitMatchSet( string unit ) { _tail.Add(new RegexMatchSetIR(unit)); Count++; } public void EmitPack( bool condition, string name = "" ) { _tail.Add(new RegexPackIR(condition, name)); Count++; } public void EmitPop( bool isSuccess ) { _tail.Add(new RegexPopIR(isSuccess)); Count++; } public void EmitTry( int count ) { _tail.Add(new RegexTryIR(count)); Count++; } public List ToList() { List result = new(Count); Node current = _head; while (current != null) { result.AddRange(current.IRList); current = current.Next!; } return result; } private class Node { public Node? Next { get; set; } public int Count => IRList.Count; public List IRList { get; } = []; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Add( RegexIR ir ) { IRList.Add(ir); } } } }