private void LoadPatterns()
        {
            _dummyCodes = new List<Pattern>();

            foreach (string line in this.Lines)
            {
                if (line.Equals(NOP_INVALID_POP, StringComparison.OrdinalIgnoreCase))
                {
                    _nopInvalidPop = true;
                    continue;
                }

                string[] opCodeGroupStr = line.Split(new char[] { ';' });
                OpCodeGroup[] opCodeGroups = new OpCodeGroup[opCodeGroupStr.Length];
                
                bool checkReference = false;

                for (int i = 0; i < opCodeGroupStr.Length; i++)
                {
                    string str = opCodeGroupStr[i];
                    opCodeGroups[i] = new OpCodeGroup(str);

                    if (str.StartsWith("~"))
                    {
                        checkReference = true;
                        str = str.Substring(1);
                    }

                    if (str.StartsWith("*"))
                    {
                        opCodeGroups[i].ExactMatch = true;
                        str = str.Substring(1);
                    }
                    else
                    {
                        opCodeGroups[i].ExactMatch = false;
                    }

                    if (str.StartsWith("!"))
                    {
                        opCodeGroups[i].ToNop = false;
                        str = str.Substring(1);
                    }
                    else
                    {
                        opCodeGroups[i].ToNop = true;
                    }

                    //if (str.StartsWith("~"))
                    //{
                    //    opCodeGroups[i].CheckReference = true;
                    //    str = str.Substring(1);
                    //}
                    //else
                    //{
                    //    opCodeGroups[i].CheckReference = false;
                    //}

                    if (str.StartsWith("[") && str.EndsWith("]"))
                    {
                        opCodeGroups[i].Optional = true;
                        opCodeGroups[i].OpCodes = str.Substring(1, str.Length - 2).Split(new char[] { ',' });
                    }
                    else
                    {
                        opCodeGroups[i].Optional = false;
                        int p = str.IndexOf(":");
                        if (p > 0)
                        {
                            opCodeGroups[i].Expression = str.Substring(p + 1);
                            str = str.Substring(0, p);
                        }
                        else
                        {
                            opCodeGroups[i].Expression = null;
                        }
                        opCodeGroups[i].OpCodes = str.Split(new char[] { ',' });
                    }

                }

                _dummyCodes.Add(new Pattern(line, opCodeGroups, checkReference));
            }
        }
        //public bool IsExceptionHandlerEnd(Instruction ins, ExceptionHandler eh)
        //{
        //    if (IsEqual(ins, eh.TryEnd) ||
        //        //IsEqual(ins, eh.FilterEnd) ||
        //        IsEqual(ins, eh.HandlerEnd)
        //        )
        //    {
        //        return true;
        //    }

        //    return false;
        //}

        private bool IsInstructionMatch(Instruction ins, OpCodeGroup opCodeGroup, Collection<Instruction> instructions)
        {
            bool match = false;
            string name = ins.OpCode.Name;
            string[] opCodes = opCodeGroup.OpCodes;
            for (int i = 0; i < opCodes.Length; i++)
            {
                if (opCodeGroup.ExactMatch)
                {
                    if (name.Equals(opCodes[i]))
                    {
                        match = true;
                        break;
                    }
                }
                else
                {
                    if (name.StartsWith(opCodes[i]))
                    {
                        match = true;
                        break;
                    }
                }
            }
            if (match && opCodeGroup.HasExpression)
            {
                if (!opCodeGroup.EvalExpression(ins, instructions))
                {
                    match = false;
                }
            }
            return match;
        }
        public Pattern(string text, OpCodeGroup[] opCodeGroups, bool checkReference)
        {
            Text = text;
            CheckReference = checkReference;

            if (opCodeGroups == null || opCodeGroups.Length < 1)
            {
                throw new ApplicationException("Invalid Pattern: " + (text == null ? String.Empty : text));
            }

            OpCodeGroups = opCodeGroups;
            MaxLength = opCodeGroups.Length;
            MinLength = MaxLength;
            for (int i = 0; i < MaxLength; i++)
            {
                if (opCodeGroups[i].Optional)
                    MinLength--;
            }
        }
        private void LoadPatterns()
        {
            _dummyCodes = new List <Pattern>();

            foreach (string line in this.Lines)
            {
                if (line.Equals(NOP_INVALID_POP, StringComparison.OrdinalIgnoreCase))
                {
                    _nopInvalidPop = true;
                    continue;
                }

                string[]      opCodeGroupStr = line.Split(new char[] { ';' });
                OpCodeGroup[] opCodeGroups   = new OpCodeGroup[opCodeGroupStr.Length];

                bool checkReference = false;

                for (int i = 0; i < opCodeGroupStr.Length; i++)
                {
                    string str = opCodeGroupStr[i];
                    opCodeGroups[i] = new OpCodeGroup(str);

                    if (str.StartsWith("~"))
                    {
                        checkReference = true;
                        str            = str.Substring(1);
                    }

                    if (str.StartsWith("*"))
                    {
                        opCodeGroups[i].ExactMatch = true;
                        str = str.Substring(1);
                    }
                    else
                    {
                        opCodeGroups[i].ExactMatch = false;
                    }

                    if (str.StartsWith("!"))
                    {
                        opCodeGroups[i].ToNop = false;
                        str = str.Substring(1);
                    }
                    else
                    {
                        opCodeGroups[i].ToNop = true;
                    }

                    //if (str.StartsWith("~"))
                    //{
                    //    opCodeGroups[i].CheckReference = true;
                    //    str = str.Substring(1);
                    //}
                    //else
                    //{
                    //    opCodeGroups[i].CheckReference = false;
                    //}

                    if (str.StartsWith("[") && str.EndsWith("]"))
                    {
                        opCodeGroups[i].Optional = true;
                        opCodeGroups[i].OpCodes  = str.Substring(1, str.Length - 2).Split(new char[] { ',' });
                    }
                    else
                    {
                        opCodeGroups[i].Optional = false;
                        int p = str.IndexOf(":");
                        if (p > 0)
                        {
                            opCodeGroups[i].Expression = str.Substring(p + 1);
                            str = str.Substring(0, p);
                        }
                        else
                        {
                            opCodeGroups[i].Expression = null;
                        }
                        opCodeGroups[i].OpCodes = str.Split(new char[] { ',' });
                    }
                }

                _dummyCodes.Add(new Pattern(line, opCodeGroups, checkReference));
            }
        }