private void TrackPush(params object[] IX) { var backtrackOp = BacktrackOperations.Add(CurrentOperation, isBack2: false); foreach (var I in IX) { Writer.Write($"{runtrack}[--{runtrackpos}] = {I}"); } Writer.Write($"{runtrack}[--{runtrackpos}] = {backtrackOp.Id}"); }
private void GenerateGo() { using (Writer.Method("protected override void Go()")) { #if DEBUG_OUTPUT Writer.Write($@"Debug.WriteLine($""Executing engine starting at {{{runtextpos}.ToString(CultureInfo.InvariantCulture)}}"")"); Writer.Write($@"Debug.WriteLine("""")"); #endif var culture = DeclareCulture(); foreach (var operation in Operations) { using (Writer.OpenScope($"{operation.Label}: // {operation.CodeName}({string.Join(", ", operation.Operands.Select(o => CSharpWriter.ConvertFormatArgument(o)))})", requireBraces: true, clearLine: true)) { CurrentOperation = operation; #if DEBUG_OUTPUT Writer.Write($"DumpState()"); Writer.Write($@"Debug.WriteLine("" {Code.OpcodeDescription(operation.Index)}"")"); Writer.Write($@"Debug.WriteLine("""")"); #endif Writer.Write($"CheckTimeout()"); GenerateOpCode(culture); } } if (BacktrackOperations.Any()) { using (Writer.OpenScope("backtrack:")) { Writer.Write($"{EnsureStorage}()"); using (Writer.Switch($"{runtrack}[{runtrackpos}++]")) { foreach (var operation in BacktrackOperations) { var summary = operation.Operation.Id >= 0 ? $"{operation.Operation.Label}, {operation.CodeName} ({(!operation.IsBack2 ? "Back" : "Back2")})" : $"{operation.CodeName} ({(!operation.IsBack2 ? "Back" : "Back2")})"; using (Writer.OpenScope($"case {operation.Id}: // {summary}")) { CurrentOperation = operation.Operation; #if DEBUG_OUTPUT if (operation.IsBack2) { Writer.Write($@"Debug.WriteLine("" Backtracking (back2) to code position {operation.Operation.Index}"")"); } else { Writer.Write($@"Debug.WriteLine("" Backtracking to code position {operation.Operation.Index}"")"); } Writer.Write($"DumpState()"); Writer.Write($@"Debug.WriteLine("" {Code.OpcodeDescription(operation.Operation.Index)} {(operation.IsBack2 ? "Back2" : "Back")}"")"); Writer.Write($@"Debug.WriteLine("""")"); #endif GenerateBacktrackOpCode(operation, culture); } } } } } } }