Exemple #1
0
        public static Expression Parse(string filterString)
        {
            var tokens = Lexer.Tokenize(filterString);
            ShuntingYardParser parser = new ShuntingYardParser(tokens);

            return(parser.Parse());
        }
Exemple #2
0
        public void TestShuntingYard02()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "1"),
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Operator, "+"),
                GenerateTestToken(TokenType.Number, "3"),
                GenerateTestToken(TokenType.Number, "4"),
                GenerateTestToken(TokenType.Operator, "*"),
                GenerateTestToken(TokenType.Operator, "-"),
                GenerateTestToken(TokenType.Number, "5"),
                GenerateTestToken(TokenType.Number, "6"),
                GenerateTestToken(TokenType.Number, "7"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Number, "8"),
                GenerateTestToken(TokenType.Operator, "*"),
                GenerateTestToken(TokenType.Operator, "+"),
                GenerateTestToken(TokenType.Number, "9"),
                GenerateTestToken(TokenType.Operator, "-"),
            };
            var arrResult  = ShuntingYardParser.InfixToRpn("1 + 2 - 3*4 + 5^6^7*8 - 9").ToArray();
            var arrResultT = ShuntingYardParser.InfixToRpn("1 + 2 - 3 4 + 5^6^7*8 - 9").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
            Assert.IsTrue(arrResult.SequenceEqual(arrResultT));
        }
Exemple #3
0
 /// <summary>
 /// Constructor that requires a lexer
 /// </summary>
 /// <param name="grammar">the grammar</param>
 public Parser(IGrammar grammar)
 {
     if (grammar == null)
     {
         throw new ArgumentNullException("grammar");
     }
     Grammar       = grammar;
     _shuntingYard = new ShuntingYardParser(grammar);
 }
Exemple #4
0
        public void TestShuntingYard06()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "5"),
                GenerateTestToken(TokenType.Number, "-5"),
                GenerateTestToken(TokenType.Operator, "+"),
                GenerateTestToken(TokenType.Number, "5"),
                GenerateTestToken(TokenType.Operator, "+"),
            };
            var arrResult = ShuntingYardParser.InfixToRpn("5 +-5+ 5").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
        }
Exemple #5
0
        public void TestShuntingYard07()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "45"),
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Number, "54"),
                GenerateTestToken(TokenType.Function, "sqrt"),
            };

            var arrResult = ShuntingYardParser.InfixToRpn("sqrt(45 ^ 2, 54)", "a").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
        }
Exemple #6
0
        public void TestShuntingYard05()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Number, "3"),
                GenerateTestToken(TokenType.Function, "max"),
                GenerateTestToken(TokenType.Number, "3"),
                GenerateTestToken(TokenType.Operator, "/"),
                GenerateTestToken(TokenType.Constant, "π"),
                GenerateTestToken(TokenType.Operator, "*"),
                GenerateTestToken(TokenType.Function, "sin"),
            };
            var arrResult = ShuntingYardParser.InfixToRpn("sin ( max ( 2, 3 ) / 3 * π )").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
        }
Exemple #7
0
        public void TestShuntingYard03()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "1"),
                GenerateTestToken(TokenType.Number, "5"),
                GenerateTestToken(TokenType.Function, "ln"),
                GenerateTestToken(TokenType.Number, "8"),
                GenerateTestToken(TokenType.Function, "exp"),
                GenerateTestToken(TokenType.Operator, "-"),
                GenerateTestToken(TokenType.Function, "sin"),
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Operator, "+"),
                GenerateTestToken(TokenType.Function, "cos"),
            };
            var arrResult = ShuntingYardParser.InfixToRpn("cos(1 + sin(ln(5) - exp(8))^2)").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
        }
Exemple #8
0
        /// <summary>
        /// Erstellt eine Baumstruktur, die einen mathematischen Term repräsentiert.
        /// </summary>
        /// <param name="token">Eine Liste an Token, die den mathematischen Term abbilden.</param>
        /// <param name="environment">Die Umgebung, in dessen Kontext der mathematische Term seine Gültigkeit besitzt.</param>
        /// <param name="bInfix">true, wenn der Term in der Infix-Notation formatiert ist, ansonsten false.</param>
        /// <returns>Eine Baumstruktur, die einen mathematischen Term repräsentiert.</returns>
        public static Node Get(IEnumerable <Token> token, MathEnvironment environment, bool bInfix)
        {
            if (bInfix)
            {
                token = ShuntingYardParser.InfixToRpn(token);
            }

            Stack <Node> stack = new Stack <Node>();

            foreach (Token t in token)
            {
                stack.Push(GenerateNodeFromToken(t, stack, environment));
            }

            if (stack.Count != 1)
            {
                throw new ArithmeticException("Unable to parse the given term.");
            }

            return(stack.Pop());
        }
Exemple #9
0
        public void TestShuntingYard04()
        {
            var arrExpected = new[]
            {
                GenerateTestToken(TokenType.Number, "3"),
                GenerateTestToken(TokenType.Number, "4"),
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Operator, "*"),
                GenerateTestToken(TokenType.Number, "1"),
                GenerateTestToken(TokenType.Number, "5"),
                GenerateTestToken(TokenType.Operator, "-"),
                GenerateTestToken(TokenType.Number, "2"),
                GenerateTestToken(TokenType.Number, "3"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Operator, "^"),
                GenerateTestToken(TokenType.Operator, "/"),
                GenerateTestToken(TokenType.Operator, "+"),
            };
            var arrResult = ShuntingYardParser.InfixToRpn("3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3").ToArray();

            Assert.IsTrue(arrResult.SequenceEqual(arrExpected));
        }
Exemple #10
0
    public void Initialize(string input)
    {
        player.GetComponent <Player>().UpdateParserScript();
        ClearTree();
        Debug.Log("input = " + input);//3 + 4 * 2 / (1 - 5) ^ 2 ^ 3

        /*
         * 3 + 4 * 2 / (1 - 5) ^ 2 ^ 3
         +
         + 3
         +         /
         *             ^
         *   4   2   (  -  )     ^
         *            1   5    2   3
         */
        ICollection <IMyOperator> operators = new List <IMyOperator>();

        operators.Add(new MyBaseOperator('^', true, 4));
        operators.Add(new MyBaseOperator('*', false, 3));
        operators.Add(new MyBaseOperator('/', false, 3));
        operators.Add(new MyBaseOperator('+', false, 2));
        operators.Add(new MyBaseOperator('-', false, 2));

        ShuntingYardParser parser = new ShuntingYardParser(operators);

        ASTNode parseTree = parser.ConvertInfixNotationToAST(input);
        //Debug.Log(parseTree.getValue());
        GameObject treeTop = GameObject.Find("Tree1");

        //parser.DrawAST(parseTree, treeTop, false, false);
        parser.designateHierarchy(parseTree, false, false);
        //parser.DrawAST2(parseTree, treeTop, 0);
        parser.DrawAST3(parseTree, treeTop, "Tree1", nodeObjects, 0, 0, "0");
        //parser.DrawASTTemplate(5, treeTop, nodeObjects, true, true);
        gameObjectTreeHeight = parser.GetHeight(nodeObjects);
        parser.DrawASTTemplate2(nodeObjects, gameObjectTreeHeight);
    }
Exemple #11
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 #12
0
 public ShuntingYardParserTests()
 {
     this.parser = new ShuntingYardParser(new Lexer());
 }
Exemple #13
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);
        }
 /// <summary>
 /// Parst einen mathematischen Term und gibt diesen aufgeteilt in einzelne Bauteile und in umgedrehter polnischer Notation zurück.
 /// </summary>
 /// <param name="strTerm">Der mathematische Term als String, z.B. "5 + 5 - sqrt(9)"</param>
 /// <param name="arrVariables">Eine Liste mit Variablen, die in dem Term vortkommen, beispielsweise "x", "y"</param>
 /// <returns></returns>
 public static Token[] TokenizeTermToRpn(string strTerm, params string[] arrVariables)
 {
     return(ShuntingYardParser.InfixToRpn(strTerm, arrVariables).ToArray());
 }