Beispiel #1
0
        private static IMachineFactory CreateMachineFactory(string pattern, RegexOptions options)
        {
            Parser            psr = new Parser();
            RegularExpression re  = psr.ParseRegularExpression(pattern, options);

#if NET_2_1
            ICompiler cmp = new PatternCompiler();
#else
            ICompiler cmp;
            if (!old_rx)
            {
                if ((options & RegexOptions.Compiled) != 0)
                {
                    cmp = new CILCompiler();
                }
                else
                {
                    cmp = new RxCompiler();
                }
            }
            else
            {
                cmp = new PatternCompiler();
            }
#endif

            re.Compile(cmp, (options & RegexOptions.RightToLeft) != 0);

            IMachineFactory machineFactory = cmp.GetMachineFactory();
            Hashtable       mapping        = new Hashtable();
            machineFactory.Gap          = psr.GetMapping(mapping);
            machineFactory.Mapping      = mapping;
            machineFactory.NamesMapping = GetGroupNamesArray(machineFactory.GroupCount, machineFactory.Mapping);

            return(machineFactory);
        }
Beispiel #2
0
        public static void DisassembleBlock(ushort[] image, int pc, int depth)
        {
            OpCode  op;
            OpFlags flags;

            for (;;)
            {
                if (pc >= image.Length)
                {
                    return;
                }

                PatternCompiler.DecodeOp(image[pc], out op, out flags);
                Console.Write(FormatAddress(pc) + ": ");                                // address
                Console.Write(new string (' ', depth * 2));                             // indent
                Console.Write(DisassembleOp(image, pc));                                // instruction
                Console.WriteLine();

                int skip;
                switch (op)
                {
                case OpCode.False:
                case OpCode.True:
                case OpCode.Until:
                    skip = 1;
                    break;

                case OpCode.Character:
                case OpCode.Category:
                case OpCode.NotCategory:
                case OpCode.Position:
                case OpCode.Open:
                case OpCode.Close:
                case OpCode.Reference:
                case OpCode.Sub:
                case OpCode.Branch:
                case OpCode.Jump:
                case OpCode.In:
                    skip = 2;
                    break;

                case OpCode.Balance:
                case OpCode.IfDefined:
                case OpCode.Range:
                case OpCode.Test:
                case OpCode.Anchor:
                    skip = 3;
                    break;

                case OpCode.Repeat:
                case OpCode.FastRepeat:
                case OpCode.Info:
                    skip = 4;
                    break;

                case OpCode.String: skip = image[pc + 1] + 2; break;

                case OpCode.Set: skip = image[pc + 2] + 3; break;

                default:
                    skip = 1;
                    break;
                }

                pc += skip;
            }
        }
Beispiel #3
0
        public static string DisassembleOp(ushort[] image, int pc)
        {
            OpCode  op;
            OpFlags flags;

            PatternCompiler.DecodeOp(image[pc], out op, out flags);
            string str = op.ToString();

            if (flags != 0)
            {
                str += "[" + flags.ToString("f") + "]";
            }

            switch (op)
            {
            case OpCode.False:
            case OpCode.True:
            case OpCode.Until:
            default:
                break;

            case OpCode.Info:
                str += " " + image[pc + 1];
                str += " (" + image[pc + 2] + ", " + image[pc + 3] + ")";
                break;

            case OpCode.Character:
                str += " '" + FormatChar((char)image[pc + 1]) + "'";
                break;

            case OpCode.Category:
            case OpCode.NotCategory:
                str += " /" + (Category)image[pc + 1];
                break;

            case OpCode.Range:
                str += " '" + FormatChar((char)image[pc + 1]) + "', ";
                str += " '" + FormatChar((char)image[pc + 2]) + "'";
                break;

            case OpCode.Set:
                str += " " + FormatSet(image, pc + 1);
                break;

            case OpCode.String:
                str += " '" + ReadString(image, pc + 1) + "'";
                break;

            case OpCode.Position:
                str += " /" + (Position)image[pc + 1];
                break;

            case OpCode.Open:
            case OpCode.Close:
            case OpCode.Reference:
                str += " " + image[pc + 1];
                break;

            case OpCode.Balance:
                str += " " + image[pc + 1] + " " + image[pc + 2];
                break;

            case OpCode.IfDefined:
            case OpCode.Anchor:
                str += " :" + FormatAddress(pc + image[pc + 1]);
                str += " " + image[pc + 2];
                break;

            case OpCode.Sub:
            case OpCode.Branch:
            case OpCode.Jump:
            case OpCode.In:
                str += " :" + FormatAddress(pc + image[pc + 1]);
                break;

            case OpCode.Test:
                str += " :" + FormatAddress(pc + image[pc + 1]);
                str += ", :" + FormatAddress(pc + image[pc + 2]);
                break;

            case OpCode.Repeat:
            case OpCode.FastRepeat:
                str += " :" + FormatAddress(pc + image[pc + 1]);
                str += " (" + image[pc + 2] + ", ";
                if (image[pc + 3] == 0xffff)
                {
                    str += "Inf";
                }
                else
                {
                    str += image[pc + 3];
                }
                str += ")";
                break;
            }

            return(str);
        }