Ejemplo n.º 1
0
        private static string ParseDictionaryKey(ExpressionReader reader)
        {
            reader.Read(); //Skip {

            var key = new StringBuilder();

            while (reader.Peek() != -1 && reader.PeekChar() != '}')
            {
                key.Append(reader.ReadChar());
            }

            if (key.Length == 0)
            {
                throw reader.UnexpectedCharacterException();
            }

            if (reader.Read() != '}')
            {
                throw reader.UnexpectedCharacterException();
            }

            reader.SkipWhitespace();

            return(key.ToString());
        }
Ejemplo n.º 2
0
        public static string Parse(ExpressionReader reader)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            if (reader.ReadChar() != '\'')
            {
                throw reader.UnexpectedCharacterException();
            }

            var value = new StringBuilder();

            while (reader.Peek() != -1)
            {
                var c = reader.ReadChar();
                switch (c)
                {
                case '\\':
                    value.Append(ParseEscapedCharacter(reader));
                    break;

                case '\'':
                    return(value.ToString());

                default:
                    value.Append(c);
                    break;
                }
            }

            throw reader.UnexpectedCharacterException();
        }
Ejemplo n.º 3
0
 public static char PeekChar(this ExpressionReader reader)
 {
     if (reader == null)
     {
         throw new ArgumentNullException(nameof(reader));
     }
     return((char)reader.Peek());
 }
Ejemplo n.º 4
0
        private static IEnumerable <IBooleanExpression> ParseBooleanExpressions(
            ExpressionReader reader, BooleanOperator booleanOperator)
        {
            reader.SkipWhitespace();

            yield return(ParseExpressionPart(reader, booleanOperator));

            reader.SkipWhitespace();

            if (reader.Peek() == -1)
            {
                yield break;
            }

            while (reader.Peek() != -1)
            {
                switch (reader.PeekChar())
                {
                case '|':
                case '&':
                    var @operator = ParseBooleanOperator(reader);
                    reader.SkipWhitespace();
                    yield return(ParseExpressionPart(reader, @operator));

                    reader.SkipWhitespace();
                    break;

                case ')':
                    yield break;

                default:
                    throw reader.UnexpectedCharacterException();
                }
            }

            if (reader.Peek() != -1)
            {
                throw reader.UnexpectedCharacterException();
            }
        }
Ejemplo n.º 5
0
        private static IBooleanExpression ParseExpression(ExpressionReader reader, BooleanOperator booleanOperator)
        {
            var expressions = ParseBooleanExpressions(reader, booleanOperator).ToArray();

            if (reader.Peek() != -1)
            {
                throw reader.UnexpectedCharacterException();
            }

            return(expressions.Length == 1
                ? expressions.Single()
                : new GroupExpression(expressions, booleanOperator));
        }
Ejemplo n.º 6
0
        public static VariableString Parse(string text)
        {
            if (text == null)
            {
                throw new ArgumentNullException(nameof(text));
            }

            var result      = new List <object>();
            var basicString = new StringBuilder();

            using (var reader = new ExpressionReader(text))
            {
                while (reader.Peek() != -1)
                {
                    switch (reader.PeekChar())
                    {
                    case '$':
                        FlushString();
                        result.Add(VariableParser.ParseVariable(reader));
                        break;

                    default:
                        var c = reader.ReadChar();
                        basicString.Append(c);
                        break;
                    }
                }
            }

            FlushString();

            return(new VariableString(result));

            void FlushString()
            {
                if (basicString.Length <= 0)
                {
                    return;
                }

                result.Add(basicString.ToString());
                basicString.Clear();
            }
        }