Beispiel #1
0
        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}");
        }
Beispiel #2
0
        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);
                                }
                            }
                        }
                    }
                }
            }
        }