diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs index 6cfe5573..782235bb 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs @@ -8,60 +8,13 @@ using StgSharp.RegularAnalysis.Abstraction; using System; using System.Collections.Generic; +using System.Runtime.Serialization.Formatters; using System.Threading; namespace StgSharp.RegularAnalysis.Text { internal partial class TextRegexSourceGen { - - private static int TryGenerateAltChain( - int outer_level, - ReadOnlySpan ir_span, - SourceGenContext sc, - in SequenceEmitter code, - in List> local_func - ) - { - /* - * L1.1 ALT chain - * window region, then further regions carrying Prev_Fail - * mirrors TryEmitAltChain - * shape if / else if / else - * sample a|b, ab|cd|ef, a|bc|def - * nature flattening, may return -1 - */ - - /* - * [004] 0001, DEF , DEF , NONE, 0000, MATCH_SEQ "abc" - * [005] 0002, DEF , Sccs, NONE, 0000, MATCH_SEQ "d" <- an alt chain begins here - * [006] 0002, Fail, Sccs, LINE, 0005, MATCH_SEQ "c" <- an alt chain ends here - * [007] 0001, Fail, DEF , LINE, 0006, POP FAIL - */ - - const RegexIRPrefixMask simple_alt = RegexIRPrefixMask.Prev_Fail | RegexIRPrefixMask.Pop_Success; - - int cur_level = ir_span[0].Prefix.WorkingRegion; - if (cur_level == outer_level) { - return -1; - } - int i = 1; - RegexIR ir; - for (; i < ir_span.Length; i++) - { - ir = ir_span[i]; - if ((ir.Prefix.Mask & simple_alt) == simple_alt) - { - // simple match - } else if (ir is RegexTryIR _try && (ir.Prefix.Mask & simple_alt) == simple_alt) - { - // match a try region - ReadOnlySpan body_span = ir_span.Slice(i + 1, i + _try.CommandCount); - i += _try.CommandCount; - } - } - return i; - } /* * ======================================================================================= * L1, several regions plus a tail @@ -241,6 +194,8 @@ namespace StgSharp.RegularAnalysis.Text * - a merged window still has to leave __ok describing the whole window */ + #region code + private static int TryGenerateTryBlock( int outer_level, ReadOnlySpan ir_span, @@ -258,5 +213,81 @@ namespace StgSharp.RegularAnalysis.Text return _try.CommandCount; } + private static int TryGenerateNamedCountAny( + int outer_level, + ReadOnlySpan ir_span, + SourceGenContext sc, + in SequenceEmitter code, + in List> local_func + ) + { + /* + * (?.*)234 + * [010] 0003, DEF , DEF , NONE, 0000, FIND_COMPLEX FURTHEST COUNT: -1 + * [011] 0003, Sccs, DEF , LINE, 0010, PACK SUCCESS GROUP: "name" + * [012] 0000, DEF , DEF , NONE, 0000, MATCH_SEQ "234" + */ + if (ir_span[0] is not RegexCountSetIR { IsDotStar:true} || + ir_span[1] is not RegexPackIR pack) + { + return -1; + } + string group_name = pack.GroupName; + + int i = 0; + for (; i < ir_span.Length; i++) { } + + return -1; + } + + private static int TryGenerateAltChain( + int outer_level, + ReadOnlySpan ir_span, + SourceGenContext sc, + in SequenceEmitter code, + in List> local_func + ) + { + /* + * L1.1 ALT chain + * window region, then further regions carrying Prev_Fail + * mirrors TryEmitAltChain + * shape if / else if / else + * sample a|b, ab|cd|ef, a|bc|def + * nature flattening, may return -1 + */ + + /* + * [004] 0001, DEF , DEF , NONE, 0000, MATCH_SEQ "abc" + * [005] 0002, DEF , Sccs, NONE, 0000, MATCH_SEQ "d" <- an alt chain begins here + * [006] 0002, Fail, Sccs, LINE, 0005, MATCH_SEQ "c" <- an alt chain ends here + * [007] 0001, Fail, DEF , LINE, 0006, POP FAIL + */ + + const RegexIRPrefixMask simple_alt = RegexIRPrefixMask.Prev_Fail | RegexIRPrefixMask.Pop_Success; + + int cur_level = ir_span[0].Prefix.WorkingRegion; + if (cur_level == outer_level) { + return -1; + } + int i = 1; + RegexIR ir; + for (; i < ir_span.Length; i++) + { + ir = ir_span[i]; + if ((ir.Prefix.Mask & simple_alt) == simple_alt) + { + // simple match + } else if (ir is RegexTryIR _try && (ir.Prefix.Mask & simple_alt) == simple_alt) + { + // match a try region + ReadOnlySpan body_span = ir_span.Slice(i + 1, i + _try.CommandCount); + i += _try.CommandCount; + } + } + return i; + } + + #endregion } } diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.cs index 5a8a4eb5..ebcbc23a 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.cs @@ -126,6 +126,7 @@ namespace StgSharp.RegularAnalysis.Text // GenerateRegion(region, sc, match_e, sub_match_list); _ = TryGenerateAltChain(0, region, sc, match_e, sub_match_list); _ = TryGenerateTryBlock(0, region, sc, match_e, sub_match_list); + _ = TryGenerateNamedCountAny(0, region, sc, match_e, sub_match_list); if (end >= ir_sp.Length) { break;