regex ir opt is done, thinking about source gen

This commit is contained in:
Youmu Liu
2026-07-01 18:23:19 +08:00
parent 1cd0257c93
commit 4e1e659259
@@ -92,6 +92,12 @@ namespace StgSharp.RegularAnalysis.Text
process_count += result; process_count += result;
} }
opt_count++; opt_count++;
} else if (opt_win_sp[0] is IRegexComplex { IsFullyOptimized: true } skip)
{
int count = skip.CommandCount;
process_count += count + 1;
Span<RegexIR> opt_block = origin_span.Slice(index, count + 1);
opt_ir.AddRange(opt_block);
} else if (opt_win_sp[0] is RegexTryIR { IsFullyOptimized: false } try_ir) } else if (opt_win_sp[0] is RegexTryIR { IsFullyOptimized: false } try_ir)
{ {
process_count++; process_count++;
@@ -125,6 +131,35 @@ namespace StgSharp.RegularAnalysis.Text
opt_ir.Clear(); opt_ir.Clear();
goto opt_cycle; goto opt_cycle;
} }
/**/
(origin_ir, opt_ir) = (opt_ir, origin_ir);
opt_ir.Clear();
index = 0;
origin_span = CollectionsMarshal.AsSpan(origin_ir);
do
{
int process_count = 0;
int last = int.Min(origin_span.Length, index + 8);
origin_span[index..last].CopyTo(opt_win_sp);
if (opt_win_sp[0] is IRegexComplex { IsFullyOptimized: true } skip)
{
int count = skip.CommandCount;
process_count += count + 1;
Span<RegexIR> opt_block = origin_span.Slice(index, count + 1);
opt_ir.AddRange(opt_block);
} else if (TryReplaceDotStar(opt_win_sp, opt_ir) >= 0)
{
process_count++;
} else
{
opt_ir.Add(opt_win_sp[0]);
process_count++;
}
index += process_count;
} while (index < origin_ir.Count);
/**/
optIR = opt_ir; optIR = opt_ir;
} }
@@ -144,7 +179,7 @@ namespace StgSharp.RegularAnalysis.Text
List<RegexIR> opt List<RegexIR> opt
) )
{ {
const int falttern_size = 32; const int flatten_size = 32;
RegexIR ir = window[0]; RegexIR ir = window[0];
if (ir is not RegexCountSeqIR seq) { if (ir is not RegexCountSeqIR seq) {
return -1; return -1;
@@ -156,10 +191,10 @@ namespace StgSharp.RegularAnalysis.Text
} }
string pattern = seq.Sequence; string pattern = seq.Sequence;
int pattern_size = pattern.Length; int pattern_size = pattern.Length;
if (pattern_size > falttern_size) { if (pattern_size > flatten_size) {
opt.Add(ir); opt.Add(ir);
} }
int min_expand = falttern_size / pattern_size; int min_expand = flatten_size / pattern_size;
min_expand = int.Min(min_expand, min); min_expand = int.Min(min_expand, min);
string expand = string.Concat(Enumerable.Repeat(pattern, min_expand)); string expand = string.Concat(Enumerable.Repeat(pattern, min_expand));
int new_min = min / min_expand; int new_min = min / min_expand;
@@ -210,6 +245,33 @@ namespace StgSharp.RegularAnalysis.Text
#endregion #endregion
private static int TryReplaceDotStar(
Span<RegexIR> window,
List<RegexIR> opt
)
{
if (window[0] is not RegexCountSetIR { IsDotStar: true } dot) {
return -1;
}
if (dot.IsGreedy)
{
RegexFindComplexIR find = new(false, -1)
{
IsFullyOptimized = true
};
opt.Add(find);
return 0;
} else
{
RegexFindComplexIR find = new(true, -1)
{
IsFullyOptimized = true
};
opt.Add(find);
return 0;
}
}
internal class RegexInfo internal class RegexInfo
{ {
@@ -323,7 +385,7 @@ namespace StgSharp.RegularAnalysis.Text
/// ///
/// </param> /// </param>
/// <returns> /// <returns>
/// Negative if cannot opt, 0 if match sucessfully, positive if meets an IRgexComplex /// Negative if cannot opt, 0 if match successfully, positive if meets an IRegexComplex
/// interface, need to call TryExpandComplexPlus /// interface, need to call TryExpandComplexPlus
/// </returns> /// </returns>
private static int TryExpandPlus( private static int TryExpandPlus(