Exemple #1
0
        /// <summary>
        /// Parses the source, and returns an expression tree
        /// </summary>
        /// <typeparam name="T">The input parameter type</typeparam>
        /// <typeparam name="TResult">The return type</typeparam>
        /// <param name="expression">The expression that is parsed</param>
        /// <returns></returns>
        public Expression <Func <T, TResult> > Parse <T, TResult>(string expression)
        {
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            var tokens = Grammar.Lexer.Tokenize(expression);

            return(_shuntingYard.BuildAST <T, TResult>(tokens));
        }
Exemple #2
0
        public void PerformanceTest2()
        {
            var grammar = new Grammar(new QuerySyntax())
            {
                Strict = true
            };
            var lexer        = new Lexer(grammar);
            var parser       = new Parser(grammar);
            var source       = "Id!=null and FirstName like '%e%' and LastName like '%e%' and BornAt<date(now()) and Address.Street like 'e%' and Address.City like '%e' or Address.Number like '%0%'";
            var shuntingYard = new ShuntingYardParser(grammar);

            var tokens = lexer.Tokenize(source).ToList();
            var rpn    = shuntingYard.BuildRPN(tokens);
            var exp    = shuntingYard.BuildAST <Person, bool>(tokens);

            Debug.WriteLine(exp);
            var expression = parser.Parse <Person, bool>(source);
            var d          = expression.Compile();

            var sw = new Stopwatch();

            sw.Start();
            for (var i = 0; i < 1000; i++)
            {
                tokens = lexer.Tokenize(source).ToList();
            }
            sw.Stop();
            Debug.WriteLine("source->tokens: " + sw.ElapsedMilliseconds);
            sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 1000; i++)
            {
                shuntingYard.BuildAST <Person, bool>(tokens);
            }
            sw.Stop();
            Debug.WriteLine("infix->AST: " + sw.ElapsedMilliseconds);
        }
Exemple #3
0
        public void PerformanceTest()
        {
            // this test shows that
            var grammar = new Grammar(new QuerySyntax());
            var lexer   = new Lexer(grammar);
            var parser  = new Parser(grammar);
            var source  = "(1+3)*(5.0/0.4)-16.3e5";
            //var source = "(color=white or color=green) and wheels >=10";
            var shuntingYard = new ShuntingYardParser(grammar);

            var tokens     = lexer.Tokenize(source).ToArray();
            var rpn        = shuntingYard.BuildRPN(tokens);
            var exp        = shuntingYard.BuildAST <object, double>(tokens);
            var expression = parser.Parse <object, double>(source);
            var d          = expression.Compile();

            var sw = new Stopwatch();

            sw.Start();
            for (var i = 0; i < 10000; i++)
            {
                lexer.Tokenize(source);
            }
            sw.Stop();
            Debug.WriteLine("tokenizing: " + sw.ElapsedMilliseconds);

            sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 10000; i++)
            {
                shuntingYard.BuildRPN(tokens);
            }
            sw.Stop();
            Debug.WriteLine("infix->postfix: " + sw.ElapsedMilliseconds);

            sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 10000; i++)
            {
                shuntingYard.BuildAST <object, double>(tokens);
            }
            sw.Stop();
            Debug.WriteLine("infix->AST: " + sw.ElapsedMilliseconds);

            sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 10000; i++)
            {
                parser.Parse <object, double>(source);
            }
            sw.Stop();
            Debug.WriteLine("source->ast: " + sw.ElapsedMilliseconds);

            sw = new Stopwatch();
            sw.Start();
            for (var i = 0; i < 10000; i++)
            {
                expression.Compile();
            }
            sw.Stop();
            Debug.WriteLine("ast->IL: " + sw.ElapsedMilliseconds);
        }