示例#1
0
 internal void Append(RawToken token)
 {
     if (token != null)
     {
         ValueBuilder.Append(token.ValueBuilder);
     }
 }
示例#2
0
 static RawToken NewTokenIfNecessary(List <RawToken> tokens, RawToken lastToken, RawTokenType curTokenType, int position)
 {
     if (lastToken == null || lastToken.TokenType != curTokenType ||
         curTokenType == RawTokenType.Symbol) // for symbol always let it be by itself
     {
         lastToken = new RawToken(curTokenType, position);
         tokens.Add(lastToken);
     }
     return(lastToken);
 }
示例#3
0
        /// <summary>
        /// Splits the specified input into a list of <see cref="RawToken"/> values using white space and symbols.
        /// The tokens can be recombined to rebuild the original input exactly.
        /// </summary>
        /// <param name="input">The input.</param>
        /// <returns></returns>
        public RawToken[] Tokenize(string input)
        {
            var tokens = new List <RawToken>();

            if (input != null)
            {
                RawToken lastToken = null;
                for (int i = 0; i < input.Length; i++)
                {
                    var ch = input[i];
                    if (char.IsWhiteSpace(ch))
                    {
                        lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.WhiteSpace, i);
                    }
                    else if (_symbols.Contains(ch))
                    {
                        lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.Symbol, i);
                    }
                    else
                    {
                        lastToken = NewTokenIfNecessary(tokens, lastToken, RawTokenType.Literal, i);
                    }

                    if (ch == '\\' && ++i < input.Length)
                    {
                        // assume escape and just append next char as-is
                        var next = input[i];
                        lastToken.ValueBuilder.Append(next);
                    }
                    else
                    {
                        lastToken.ValueBuilder.Append(ch);
                    }
                }
            }
            return(tokens.ToArray());
        }
示例#4
0
        ExpressionToken HandleNonOperatorSymbolToken(ListReader <RawToken> reader, ExpressionToken lastExpToken, RawToken curRawToken)
        {
            switch (curRawToken.Value)
            {
            case ",":
                lastExpToken = new ExpressionToken {
                    TokenType = ExpressionTokenType.Comma
                };
                _currentTokens.Add(lastExpToken);
                lastExpToken.Append(curRawToken);
                break;

            case "(":
                // if last one is string make it a function
                if (lastExpToken != null && lastExpToken.TokenType == ExpressionTokenType.Value)
                {
                    lastExpToken.TokenType = ExpressionTokenType.Function;
                }

                lastExpToken = new ExpressionToken {
                    TokenType = ExpressionTokenType.OpenParenthesis
                };
                _currentTokens.Add(lastExpToken);
                lastExpToken.Append(curRawToken);
                break;

            case ")":
                lastExpToken = new ExpressionToken {
                    TokenType = ExpressionTokenType.CloseParenthesis
                };
                _currentTokens.Add(lastExpToken);
                lastExpToken.Append(curRawToken);
                break;

            case "{":
                // read until end of }
                lastExpToken = ReadToLiteralAs(reader, "}", ExpressionTokenType.Field);
                break;

            case "\"":
                // read until end of "
                lastExpToken = ReadToLiteralAs(reader, "\"", ExpressionTokenType.DoubleQuoted);
                break;

            case "'":
                // read until end of '
                lastExpToken = ReadToLiteralAs(reader, "'", ExpressionTokenType.SingleQuoted);
                break;
            }

            return(lastExpToken);
        }