regex ir opt is done, thinking about source gen
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user