示例#1
0
        public void Visit(CharSet value)
        {
            StartWriting();
            if (value.InverseSet && value.Chars.Count == 0)
            {
                for (var i = 0; i < value.Repeat.MinCount; i++)
                {
                    _writer.Write(_defn.Pattern_SingleChar);
                }
                if (value.Repeat.MaxCount == value.Repeat.MinCount)
                {
                    // Do Nothing
                }
                else if (value.Repeat.MaxCount == int.MaxValue)
                {
                    _writer.Write(_defn.Pattern_Anything);
                }
                else
                {
                    throw new NotSupportedException();
                }
            }
            else if (_defn.Pattern_SingleDigit != '\0' && !value.InverseSet && Utils.ListEquals(value.Chars, CharSet.__digits) &&
                     value.Repeat.MinCount >= 1 && value.Repeat.MinCount < int.MaxValue && value.Repeat.MinCount == value.Repeat.MaxCount)
            {
                for (var j = 0; j < value.Repeat.MinCount; j++)
                {
                    _writer.Write(_defn.Pattern_SingleDigit);
                }
            }
            else if (_defn.AllowCharSet && value.Repeat.MinCount >= 1 && value.Repeat.MinCount < int.MaxValue && value.Repeat.MinCount == value.Repeat.MaxCount)
            {
                bool inRange = false;

                for (var j = 0; j < value.Repeat.MinCount; j++)
                {
                    _writer.Write("[");
                    if (value.InverseSet)
                    {
                        _writer.Write(_defn.Pattern_InverseSet);
                    }
                    inRange = false;
                    for (var i = 0; i < value.Chars.Count; i++)
                    {
                        if (i > 0)
                        {
                            if (value.Chars[i] == value.Chars[i - 1] + 1)
                            {
                                if (!inRange)
                                {
                                    _writer.Write(_defn.Pattern_SetRange);
                                }
                                inRange = true;
                            }
                            else if (inRange)
                            {
                                _writer.Write(value.Chars[i - 1]);
                                inRange = false;
                            }
                        }

                        if (!inRange)
                        {
                            _writer.Write(value.Chars[i]);
                        }
                    }
                    if (inRange)
                    {
                        _writer.Write(value.Chars[value.Chars.Count - 1]);
                    }
                    _writer.Write("]");
                }
            }
            else
            {
                throw new NotSupportedException();
            }
        }