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(); } }