diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs index 027fc1b6..9564aa62 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.MultiIR.cs @@ -277,6 +277,11 @@ namespace StgSharp.RegularAnalysis.Text ir = ir_span[i]; if ((ir.Prefix.Mask & simple_alt) == simple_alt) { + if (TryGenerateSingleIR(outer_level, [ir], sc, code, local_func) > 0) + { + // TODO add additional code for the alt chain + } + // simple match } else if (ir is RegexTryIR _try && (ir.Prefix.Mask & simple_alt) == simple_alt) { diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.SingleIR.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.SingleIR.cs index 4def43ef..2ab7a9ef 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.SingleIR.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenClass.SingleIR.cs @@ -5,7 +5,9 @@ // SPDX-License-Identifier: MIT // ----------------------------------------------------------------------------- +using Microsoft.CodeAnalysis.CSharp.Syntax; using StgSharp.RegularAnalysis.Abstraction; +using System.Diagnostics.Metrics; using System.Globalization; using System.Text.RegularExpressions; @@ -76,6 +78,25 @@ namespace StgSharp.RegularAnalysis.Text #region code + private static int TryGenerateSingleIR( + int outer_level, + ReadOnlySpan ir_span, + SourceGenContext sc, + in SequenceEmitter code, + in List> local_func + ) + { + return TryGenerateCountSeq(outer_level, ir_span, sc, code, + local_func) > 0 || + TryGenerateCountSet(outer_level, ir_span, sc, code, + local_func) > 0 || + TryGenerateMatchSet(outer_level, ir_span, sc, code, + local_func) > 0 || + TryGenerateMatchSeq(outer_level, ir_span, sc, code, local_func) > 0 ? + 1 : + -1; + } + private static int TryGeneratePack( int outer_level, ReadOnlySpan ir_span, @@ -203,6 +224,7 @@ namespace StgSharp.RegularAnalysis.Text .AppendLine("}") .AppendLine("else") .AppendLine("{")//TODO fail here + .AppendLine("break;") .AppendLine("}"); return 1; } @@ -233,6 +255,10 @@ namespace StgSharp.RegularAnalysis.Text * { * success here * } + * else + * { + * fail case + * } */ for (int i = 1; i < set_arr.Length - 1; i++) { @@ -244,7 +270,11 @@ namespace StgSharp.RegularAnalysis.Text _case_code = GenLine(set, sc, ")"); _ = code.AppendLine(_case_code) .AppendLine("{") - .AppendLine(sc.MakeRemainOffset(1))// TODO case success + .AppendLine(sc.MakeRemainOffset(1)) // TODO case success + .AppendLine("}") + .AppendLine("else") + .AppendLine("{") + .AppendLine("break;") // TODO case fail .AppendLine("}"); return 1; } diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenContext.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenContext.cs index 6186a4e5..8c2abdb1 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenContext.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenContext.cs @@ -56,6 +56,21 @@ namespace StgSharp.RegularAnalysis.Text public string StepResult { get; } = _stepResult; + public string[] BeginRegion() + { + return [ + "do", + "{" + ]; + } + + public string[] CloseRegion() + { + return [ + "} while(true);" + ]; + } + /// /// Emits declarations for every slot requested during body generation. /// diff --git a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenFile.cs b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenFile.cs index 01c7ce7d..9d3eb518 100644 --- a/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenFile.cs +++ b/src/StgSharp.RegularAnalysis/Text/TextRegexSourceGen.GenFile.cs @@ -91,7 +91,8 @@ namespace StgSharp.RegularAnalysis.Text brace_count = 0; foreach (string line in ce) { - bool is_right_brace = line == "}"; + bool is_right_brace = (line == "}") || + line.StartsWith("} while", StringComparison.InvariantCulture); brace_count -= is_right_brace ? 1 : 0; for (int i = 0; i < brace_count; i++) { _ = code_source.Append(" ");