// ----------------------------------------------------------------------------- // file="RegexTokenParser" // Project: StgSharp // Copyright (c) Nitload. // SPDX-License-Identifier: MIT // ----------------------------------------------------------------------------- using StgSharp.RegularAnalysis.Abstraction; using System; using System.Collections.Generic; using System.Diagnostics.Tracing; using System.IO.Pipes; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StgSharp.RegularAnalysis.Text { internal class RegexTokenParser : TokenParser { private readonly Queue> _buffer = []; private RegexElementLabel _prev; public override bool IsEmpty => Source.IsEmpty && _buffer.Count == 0; public override Token ReadToken() { if (_buffer.TryDequeue(out Token token)) { return token; } if (Source.TryReadToken(out Token orig)) { if (((int)(orig.Flag & RegexElementLabel.ATOM_BEGIN) != 0) && ((int)_prev != 0)) { Token ret = new Token(string.Empty, orig.Line, orig.Column, RegexElementLabel.CONCAT); _buffer.Enqueue(orig); _prev = orig.Flag & RegexElementLabel.ATOM_END; return ret; } else { _prev = orig.Flag & RegexElementLabel.ATOM_END; return orig; } } else { return Token.Empty; } } public override bool TryReadToken( out Token t ) { if (IsEmpty) { t = Token.Empty; return false; } t = ReadToken(); return t != Token.Empty; } } }