예제 #1
0
        public void Visit(LetterRangeToken token)
        {
            Success = false;
            var read = _Reader.Read();

            if (read == -1)
            {
                return;
            }
            var currentChar = (char)read;

            if (currentChar >= token.Start && currentChar <= token.End)
            {
                if (token.IsNegated)
                {
                    return; // failed to match
                }
            }
            else
            {
                if (!token.IsNegated)
                {
                    return; // failed to match
                }
            }

            AddMatch(new GlobTokenMatch()
            {
                Token = token, Value = currentChar.ToString()
            });
        }
예제 #2
0
 public IGlobTokenEvaluator CreateTokenEvaluator(LetterRangeToken token)
 {
     if (_options.CaseInsensitive)
     {
         return(new LetterRangeTokenEvaluatorCaseInsensitive(token));
     }
     return(new LetterRangeTokenEvaluator(token));
 }
 public LetterRangeTokenEvaluatorCaseInsensitive(LetterRangeToken token)
 {
     _token = token;
     _startUpperInvariant = char.ToUpperInvariant(token.Start);
     _endUpperInvariant   = char.ToUpperInvariant(token.End);
     _startLowerInvariant = char.ToLowerInvariant(token.Start);
     _endLowerInvariant   = char.ToLowerInvariant(token.End);
 }
예제 #4
0
 void IGlobTokenVisitor.Visit(LetterRangeToken token)
 {
     _stringBuilder.Append('[');
     if (token.IsNegated)
     {
         _stringBuilder.Append('^');
     }
     _stringBuilder.Append(Regex.Escape(token.Start.ToString()));
     _stringBuilder.Append('-');
     _stringBuilder.Append(Regex.Escape(token.End.ToString()));
     _stringBuilder.Append(']');
 }
예제 #5
0
        void IGlobTokenVisitor.Visit(LetterRangeToken token)
        {
            _stringBuilder.Append('[');

            if (token.IsNegated)
            {
                _stringBuilder.Append('!');
            }

            _stringBuilder.Append(token.Start);
            _stringBuilder.Append('-');
            _stringBuilder.Append(token.End);
            _stringBuilder.Append(']');
        }
예제 #6
0
 void IGlobTokenVisitor.Visit(LetterRangeToken token)
 {
     AddMatchGenerator(new LetterRangeTokenMatchGenerator(token, _random));
 }
예제 #7
0
        /// <summary>
        /// Parses a token for a range or list globbing expression.
        /// </summary>
        private IGlobToken ReadRangeOrListToken(GlobStringReader reader)
        {
            bool isNegated     = false;
            bool isNumberRange = false;
            bool isLetterRange = false;
            bool isCharList    = false;

            if (reader.PeekChar() == GlobStringReader.ExclamationMarkChar)
            {
                isNegated = true;
                reader.Read();
            }

            var nextChar = reader.PeekChar();

            if (Char.IsLetterOrDigit(nextChar))
            {
                reader.Read();
                nextChar = reader.PeekChar();
                if (nextChar == GlobStringReader.DashChar)
                {
                    if (Char.IsLetter(reader.CurrentChar))
                    {
                        isLetterRange = true;
                    }
                    else
                    {
                        isNumberRange = true;
                    }
                    //  throw new ArgumentOutOfRangeException("Range expressions must either be a letter range, i.e [a-z] or a number range i.e [0-9]");
                }
                else
                {
                    isCharList = true;
                }

                AcceptCurrentChar(reader);
            }
            else
            {
                isCharList = true;
                reader.Read();
                AcceptCurrentChar(reader);
            }

            if (isLetterRange || isNumberRange)
            {
                // skip over the dash char
                reader.ReadChar();
            }

            while (reader.ReadChar())
            {
                //  ReadCharacter(CharacterType.BracketedText, CurrentChar);
                if (reader.IsEndOfRangeOrList)
                {
                    var peekChar = reader.PeekChar();
                    // Close brackets within brackets are escaped with another
                    // Close bracket. e.g. [a]] matches a[
                    if (peekChar == GlobStringReader.CloseBracketChar)
                    {
                        AcceptCurrentChar(reader);
                        // Read();
                        //ReadCharacter(CharacterType.BracketedText, CurrentChar);
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    AcceptCurrentChar(reader);
                }
            }

            // construct token
            IGlobToken result = null;
            var        value  = GetBufferAndReset();

            if (isCharList)
            {
                result = new CharacterListToken(value.ToCharArray(), isNegated);
            }
            else if (isLetterRange)
            {
                var start = value[0];
                var end   = value[1];
                result = new LetterRangeToken(start, end, isNegated);
            }
            else if (isNumberRange)
            {
                var start = value[0]; // int.Parse(value[0].ToString());
                var end   = value[1]; // int.Parse(value[1].ToString());
                result = new NumberRangeToken(start, end, isNegated);
            }

            return(result);
        }
예제 #8
0
 public void Visit(LetterRangeToken token)
 {
     AddEvaluator(_evaluatorFactory.CreateTokenEvaluator(token));
 }
 public LetterRangeTokenEvaluator(LetterRangeToken token)
 {
     _token = token;
 }
 public LetterRangeTokenMatchGenerator(LetterRangeToken token, Random _random)
 {
     this.token   = token;
     this._random = _random;
 }
예제 #11
0
 public void Visit(LetterRangeToken token)
 {
     AddEvaluator(new LetterRangeTokenEvaluator(token));
 }