private FSM <int> ParseSet()
        {
            List <int> charset = new List <int>();
            bool       negate  = false;

            if (this.Pattern[_parseIndex] == '^')
            {
                negate = true;
                _parseIndex++;
            }

            while (this.Pattern[_parseIndex] != ']')
            {
                switch (this.Pattern[_parseIndex])
                {
                case '\\':
                    _parseIndex++;
                    charset.Add(this.Pattern[_parseIndex++]);
                    break;

                case '-':
                    _parseIndex++;
                    int start = charset.Last();
                    charset.RemoveAt(charset.Count - 1);
                    for (int c = start; c <= this.Pattern[_parseIndex]; c++)
                    {
                        charset.Add(c);
                    }
                    _parseIndex++;
                    break;

                default:
                    charset.Add(this.Pattern[_parseIndex++]);
                    break;
                }
            }

            //consume closing set
            _parseIndex++;

            FSM <int> result = new NFSM <int>(-1);

            for (int i = 0; i < 256; i++)
            {
                if (i != (int)'\\')
                {
                    if ((!negate && charset.Contains(i)) || (negate && !charset.Contains(i)))
                    {
                        result = result.Or(i);
                    }
                }
            }

            return(result);
        }
Exemplo n.º 2
0
        private FSM <int> AnyChar()
        {
            FSM <int> result = new NFSM <int>(-1);

            for (int i = 0; i < 256; i++)
            {
                result = result.Or(i);
            }

            return(result);
        }