예제 #1
0
        private ConditionExpression ParseLiteralExpression()
        {
            if (tokenizer.IsToken(ConditionTokenType.LeftParen))
            {
                tokenizer.GetNextToken();
                var e = ParseExpression();
                tokenizer.Expect(ConditionTokenType.RightParen);
                return e;
            }

            if (tokenizer.IsToken(ConditionTokenType.Minus))
            {
                tokenizer.GetNextToken();
                if (!tokenizer.IsNumber())
                {
                    throw new ConditionParseException("Number expected, got " + tokenizer.TokenType);
                }

                var numberString = tokenizer.TokenValue;
                tokenizer.GetNextToken();
                if (numberString.IndexOf('.') >= 0)
                {
                    return new ConditionLiteralExpression(-double.Parse(numberString, CultureInfo.InvariantCulture));
                }

                return new ConditionLiteralExpression(-int.Parse(numberString, CultureInfo.InvariantCulture));
            }

            if (tokenizer.IsNumber())
            {
                var numberString = tokenizer.TokenValue;
                tokenizer.GetNextToken();
                if (numberString.IndexOf('.') >= 0)
                {
                    return new ConditionLiteralExpression(double.Parse(numberString, CultureInfo.InvariantCulture));
                }

                return new ConditionLiteralExpression(int.Parse(numberString, CultureInfo.InvariantCulture));
            }

            if (tokenizer.TokenType == ConditionTokenType.String)
            {
                ConditionExpression e = new ConditionLayoutExpression(Layout.FromString(tokenizer.StringTokenValue, configurationItemFactory));
                tokenizer.GetNextToken();
                return e;
            }

            if (tokenizer.TokenType == ConditionTokenType.Keyword)
            {
                var keyword = tokenizer.EatKeyword();

                if (0 == string.Compare(keyword, "level", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionLevelExpression();
                }

                if (0 == string.Compare(keyword, "logger", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionLoggerNameExpression();
                }

                if (0 == string.Compare(keyword, "message", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionMessageExpression();
                }

                if (0 == string.Compare(keyword, "loglevel", StringComparison.OrdinalIgnoreCase))
                {
                    tokenizer.Expect(ConditionTokenType.Dot);
                    return new ConditionLiteralExpression(LogLevel.FromString(tokenizer.EatKeyword()));
                }

                if (0 == string.Compare(keyword, "true", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionLiteralExpression(true);
                }

                if (0 == string.Compare(keyword, "false", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionLiteralExpression(false);
                }

                if (0 == string.Compare(keyword, "null", StringComparison.OrdinalIgnoreCase))
                {
                    return new ConditionLiteralExpression(null);
                }

                if (tokenizer.TokenType == ConditionTokenType.LeftParen)
                {
                    tokenizer.GetNextToken();

                    var predicateExpression = ParsePredicate(keyword);
                    return predicateExpression;
                }
            }

            throw new ConditionParseException("Unexpected token: " + tokenizer.TokenValue);
        }
예제 #2
0
        private ConditionExpression ParseLiteralExpression()
        {
            if (tokenizer.IsToken(ConditionTokenType.LeftParen))
            {
                tokenizer.GetNextToken();
                var e = ParseExpression();
                tokenizer.Expect(ConditionTokenType.RightParen);
                return(e);
            }

            if (tokenizer.IsToken(ConditionTokenType.Minus))
            {
                tokenizer.GetNextToken();
                if (!tokenizer.IsNumber())
                {
                    throw new ConditionParseException("Number expected, got " + tokenizer.TokenType);
                }

                var numberString = tokenizer.TokenValue;
                tokenizer.GetNextToken();
                if (numberString.IndexOf('.') >= 0)
                {
                    return(new ConditionLiteralExpression(-double.Parse(numberString, CultureInfo.InvariantCulture)));
                }

                return(new ConditionLiteralExpression(-int.Parse(numberString, CultureInfo.InvariantCulture)));
            }

            if (tokenizer.IsNumber())
            {
                var numberString = tokenizer.TokenValue;
                tokenizer.GetNextToken();
                if (numberString.IndexOf('.') >= 0)
                {
                    return(new ConditionLiteralExpression(double.Parse(numberString, CultureInfo.InvariantCulture)));
                }

                return(new ConditionLiteralExpression(int.Parse(numberString, CultureInfo.InvariantCulture)));
            }

            if (tokenizer.TokenType == ConditionTokenType.String)
            {
                ConditionExpression e = new ConditionLayoutExpression(Layout.FromString(tokenizer.StringTokenValue, configurationItemFactory));
                tokenizer.GetNextToken();
                return(e);
            }

            if (tokenizer.TokenType == ConditionTokenType.Keyword)
            {
                var keyword = tokenizer.EatKeyword();

                if (0 == string.Compare(keyword, "level", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionLevelExpression());
                }

                if (0 == string.Compare(keyword, "logger", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionLoggerNameExpression());
                }

                if (0 == string.Compare(keyword, "message", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionMessageExpression());
                }

                if (0 == string.Compare(keyword, "loglevel", StringComparison.OrdinalIgnoreCase))
                {
                    tokenizer.Expect(ConditionTokenType.Dot);
                    return(new ConditionLiteralExpression(LogLevel.FromString(tokenizer.EatKeyword())));
                }

                if (0 == string.Compare(keyword, "true", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionLiteralExpression(true));
                }

                if (0 == string.Compare(keyword, "false", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionLiteralExpression(false));
                }

                if (0 == string.Compare(keyword, "null", StringComparison.OrdinalIgnoreCase))
                {
                    return(new ConditionLiteralExpression(null));
                }

                if (tokenizer.TokenType == ConditionTokenType.LeftParen)
                {
                    tokenizer.GetNextToken();

                    var predicateExpression = ParsePredicate(keyword);
                    return(predicateExpression);
                }
            }

            throw new ConditionParseException("Unexpected token: " + tokenizer.TokenValue);
        }