private void ConsumePropertyName(ReadOnlySpan <byte> data)
        {
            var i   = 0;
            var val = data[i];

            while (val != FilterConstants.Tab && val != FilterConstants.Space)
            {
                i++;
                if (i >= data.Length)
                {
                    break;
                }

                val = data[i];

                if (val == FilterConstants.LineFeed || val == FilterConstants.CarriageReturn)
                {
                    throw new FormatException("filter表达式不允许换行。");
                }
            }

            ValueSpan  = _buffer.Slice(_consumed, i);
            TokenType  = FilterTokenType.PropertyName;
            _consumed += i;
        }
        private void ConsumeString(ReadOnlySpan <byte> data)
        {
            var i = 0;

            while (true)
            {
                i++;
                if (i >= data.Length)
                {
                    break;
                }

                var val = data[i];

                if (val == FilterConstants.LineFeed || val == FilterConstants.CarriageReturn)
                {
                    throw new FormatException("filter表达式不允许换行。");
                }

                if (val == FilterConstants.Quote && data[i - 1] != FilterConstants.BackSlash)
                {
                    i++;
                    break;
                }
            }

            ValueSpan  = _buffer.Slice(_consumed, i);
            TokenType  = FilterTokenType.String;
            _consumed += i;
        }
示例#3
0
        private bool Is(FilterTokenType tokenType)
        {
            FilterToken filterToken = Peek();

            if (filterToken != null)
            {
                return(filterToken.TokenType == tokenType);
            }
            return(false);
        }
示例#4
0
        private FilterToken Expect(FilterTokenType tokenType)
        {
            if (!Is(tokenType))
            {
                throw new FilterParserException("Expected " + tokenType);
            }
            FilterToken filterToken = Peek();

            ++currentTokenIndex;
            return(filterToken);
        }
示例#5
0
        /// <summary>
        /// Espera pelo tipo de token.
        /// </summary>
        /// <param name="tokenType"></param>
        /// <returns></returns>
        private FilterToken Expect(FilterTokenType tokenType)
        {
            if (!Is(tokenType))
            {
                throw new FilterParserException("Expected " + tokenType);
            }
            FilterToken token = this.Peek();

            _currentTokenIndex++;
            return(token);
        }
示例#6
0
 private void Emit(FilterTokenType tokenType, int intData = 0)
 {
     Result.Add(new FilterParserBasicImpl.FilterToken
     {
         Data      = _buffer.ToString(),
         TokenType = tokenType,
         IntData   = intData,
     });
     ClearBuffer();
     SkipWhitespace();
 }
示例#7
0
        private FilterToken Expect(FilterTokenType tokenType)
        {
            if (!Is(tokenType))
            {
                throw new FilterParserException("Expected " + tokenType);
            }

            FilterToken token = Peek();
            currentTokenIndex++;
            return token;
        }
        private void ConsumeNumber(ReadOnlySpan <byte> data)
        {
            const string msg              = "包含格式不正确的数字。";
            var          i                = 0;
            var          val              = data[i];
            var          minusFlag        = false;
            var          decimalPointFlag = false;

            if (val == '-')
            {
                minusFlag = true;
            }

            while (val != FilterConstants.Tab && val != FilterConstants.Space && val != FilterConstants.CloseParentheses)
            {
                i++;
                if (i >= data.Length)
                {
                    break;
                }

                val = data[i];

                if (val == FilterConstants.Period)
                {
                    if (minusFlag && i == 1 || decimalPointFlag)
                    {
                        throw new FormatException(msg);
                    }

                    decimalPointFlag = true;
                    continue;
                }

                if (val == '-' || !char.IsDigit((char)val))
                {
                    throw new FormatException(msg);
                }
            }

            if (minusFlag && i == 1)
            {
                throw new FormatException(msg);
            }

            if (val == FilterConstants.Period)
            {
                throw new FormatException(msg);
            }

            ValueSpan  = _buffer.Slice(_consumed, i);
            TokenType  = FilterTokenType.Number;
            _consumed += i;
        }
示例#9
0
        private void Match(IEnumerable <char> token, FilterTokenType filterTokenType)
        {
            int startPosition = inputPosition + 1;

            foreach (char c in token)
            {
                if (IsEndOfStream())
                {
                    tokens.Add(new FilterToken(FilterTokenType.Error, Resources.FilterParser_UnexpectedEndOfInput, inputPosition));
                    break;
                }
                char inputChar = (char)input.Peek();
                if (char.ToLower(inputChar) == c)
                {
                    ConsumeNextChar();
                }
                else
                {
                    tokens.Add(new FilterToken(FilterTokenType.Error, GetCharacterMessage(inputChar), inputPosition));
                }
            }
            tokens.Add(new FilterToken(filterTokenType, null, startPosition));
        }
示例#10
0
 public Token(FilterTokenType tokenType, string value, int?index)
 {
     TokenType = tokenType;
     Value     = value;
     Index     = index;
 }
示例#11
0
        private bool Is(FilterTokenType tokenType)
        {
            FilterToken token = Peek();

            return(token != null && token.TokenType == tokenType);
        }
示例#12
0
 internal FilterToken(FilterTokenType type, string text, int position)
 {
     this.type     = type;
     this.text     = text;
     this.position = position;
 }
示例#13
0
        private bool Is(FilterTokenType tokenType)
        {
            FilterToken token = Peek();

            return(token != null && !token.Value.Equals("null") && token.TokenType == tokenType);
        }
示例#14
0
        private void MatchUndelimitedWord()
        {
            var  chars         = new StringBuilder();
            bool errorFound    = false;
            int  startPosition = inputPosition + 1;
            char previousChar  = ConsumeNextChar();

            if (previousChar != escapeCharacter)
            {
                chars.Append(previousChar);
            }
            int nextCharCode = input.Peek();

            while (nextCharCode != -1)
            {
                char nextChar = (char)nextCharCode;
                if (previousChar == escapeCharacter)
                {
                    if (escapableCharacters.Contains(nextChar))
                    {
                        chars.Append(ConsumeNextChar());
                        // Avoid the case when the last slash in an expression like //'
                        // makes the following character to be escaped
                        previousChar = (char)0;
                    }
                    else
                    {
                        tokens.Add(new FilterToken(FilterTokenType.Error,
                                                   String.Format(Resources.FilterParser_CannotEscapeCharacter, GetCharacterMessage(nextChar)),
                                                   inputPosition));
                        ConsumeNextChar();
                        errorFound = true;
                        break;
                    }
                }
                else if (IsWordChar(nextChar))
                {
                    previousChar = ConsumeNextChar();
                    chars.Append(previousChar);
                }
                else
                {
                    break;
                }
                nextCharCode = input.Peek();
            }
            if (!errorFound)
            {
                if (previousChar == escapeCharacter)
                {
                    // The escape character was not followed by another character
                    tokens.Add(new FilterToken(FilterTokenType.Error, Resources.FilterParser_MissingEscapedCharacter, inputPosition));
                }
                else
                {
                    string          tokenText       = chars.ToString();
                    FilterTokenType filterTokenType = GetReservedWord(tokenText);
                    if (filterTokenType != FilterTokenType.None)
                    {
                        tokens.Add(new FilterToken(filterTokenType, null, startPosition));
                    }
                    else
                    {
                        tokens.Add(new FilterToken(FilterTokenType.Word, tokenText, startPosition));
                    }
                }
            }
        }
示例#15
0
        private bool ConsumeToken(byte first)
        {
            if (first == FilterConstants.OpenParentheses)
            {
                TokenType = FilterTokenType.StartGrouping;
                ValueSpan = _buffer.Slice(_consumed, 1);
                _consumed++;

                return(true);
            }

            if (first == FilterConstants.CloseParentheses)
            {
                TokenType = FilterTokenType.EndGrouping;
                ValueSpan = _buffer.Slice(_consumed, 1);
                _consumed++;

                return(true);
            }

            var localBuffer = _buffer.Slice(_consumed);
            int consumed;

            if (first == '-' || char.IsDigit((char)first))
            {
                ConsumeNumber(localBuffer);
                return(true);
            }

            if (first == FilterConstants.Quote)
            {
                ConsumeString(localBuffer);
                return(true);
            }

            if (first == 't')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.TrueValue, out consumed))
                {
                    TokenType  = FilterTokenType.True;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'f')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.FalseValue, out consumed))
                {
                    TokenType  = FilterTokenType.False;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'n')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.NullValue, out consumed))
                {
                    TokenType  = FilterTokenType.Null;
                    _consumed += consumed;
                    return(true);
                }

                if (TryGetReservedWord(localBuffer, FilterConstants.NotEqualOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }

                if (TryGetReservedWord(localBuffer, FilterConstants.LogicalNegationOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.UnaryLogicalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'e')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.EqualOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'g')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.GreaterThanOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }

                if (TryGetReservedWord(localBuffer, FilterConstants.GreaterThanOrEqualOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'l')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.LessThanOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }

                if (TryGetReservedWord(localBuffer, FilterConstants.LessThanOrEqualOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.RelationalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'a')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.LogicalAndOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.BinaryLogicalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            if (first == 'o')
            {
                if (TryGetReservedWord(localBuffer, FilterConstants.LogicalOrOperatorValue, out consumed))
                {
                    TokenType  = FilterTokenType.BinaryLogicalOperator;
                    _consumed += consumed;
                    return(true);
                }
            }

            ConsumePropertyName(localBuffer);
            return(true);
        }
示例#16
0
 private void Match(IEnumerable<char> token, FilterTokenType filterTokenType)
 {
     int startPosition = inputPosition + 1;
     foreach (char c in token)
     {
         if (IsEndOfStream())
         {
             tokens.Add(new FilterToken(FilterTokenType.Error, Resources.FilterParser_UnexpectedEndOfInput, inputPosition));
             break;
         }
         char inputChar = (char)input.Peek();
         if (char.ToLower(inputChar) == c)
         {
             ConsumeNextChar();
         }
         else
         {
             tokens.Add(new FilterToken(FilterTokenType.Error, GetCharacterMessage(inputChar), inputPosition));
         }
     }
     tokens.Add(new FilterToken(filterTokenType, null, startPosition));
 }
示例#17
0
        private bool IsIn(FilterTokenType tokenType)
        {
            FilterToken token = Peek();

            return(token != null && token.TokenType == tokenType && token.Value.Equals("in", StringComparison.CurrentCultureIgnoreCase));
        }
示例#18
0
 private bool Is(FilterTokenType tokenType)
 {
     FilterToken token = Peek();
     return token != null && token.TokenType == tokenType;
 }
示例#19
0
 internal FilterToken(FilterTokenType type, string text, int position)
 {
     this.type = type;
     this.text = text;
     this.position = position;
 }