Пример #1
0
        public void TestRandomExpression()
        {
            ExecutionEnvironment e = new ExecutionEnvironment();

            e.RegisterValue("a", 1);
            e.RegisterValue("b", 7);
            e.RegisterValue("c", 5);
            Identifier a = new Identifier()
            {
                Variable = "a"
            };
            Identifier b = new Identifier()
            {
                Variable = "b"
            };
            Identifier c = new Identifier()
            {
                Variable = "c"
            };
            RandomExpression s = new RandomExpression()
            {
                Min = a, Max = b
            };
            var c1 = s.Execute(e);

            Assert.AreEqual(c1.Type, CompletionType.Value);
            e.SetValue("a", 3);
            var c2 = s.Execute(e);

            Assert.AreEqual(c2.Type, CompletionType.Value);
        }
Пример #2
0
        private IExpression DoFactor()
        {
            if (currentToken == Token.Double)
            {
                var expression =
                    new NumericConstantExpression(lexicalAnalyzer.CurrentValue);
                currentToken = lexicalAnalyzer.GetCurrentToken();
                return(expression);
            }
            else if (currentToken == Token.Param)
            {
                var expression = new VariableExpression(lexicalAnalyzer.CurrentParameter);
                currentToken = lexicalAnalyzer.GetCurrentToken();
                return(expression);
            }
            else if (currentToken == Token.Sin ||
                     currentToken == Token.Cos ||
                     currentToken == Token.Tan ||
                     currentToken == Token.Cot)
            {
                var old = currentToken;
                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.OParen)
                {
                    throw new Exception("Illegal Token");
                }

                currentToken = lexicalAnalyzer.GetCurrentToken();
                var expression = DoExpression();
                if (currentToken != Token.CParen)
                {
                    throw new Exception("Missing Closeing Parenthesis\n");
                }

                if (old == Token.Cos)
                {
                    expression = new CosExpression(expression);
                }
                else
                {
                    expression = new SinExpression(expression);
                }
                currentToken = lexicalAnalyzer.GetCurrentToken();

                return(expression);
            }
            else if (currentToken == Token.OParen)
            {
                currentToken = lexicalAnalyzer.GetCurrentToken();
                var expression = DoExpression();
                if (currentToken != Token.CParen)
                {
                    throw new Exception("Missing Closing Parenthesis\n");
                }
                currentToken = lexicalAnalyzer.GetCurrentToken();

                return(expression);
            }
            else if (currentToken == Token.Plus || currentToken == Token.Sub)
            {
                var old = currentToken;
                currentToken = lexicalAnalyzer.GetCurrentToken();
                var expression = DoFactor();

                expression = new UnaryExpression(expression,
                                                 old == Token.Plus ? OperationType.Plus : OperationType.Minus);

                return(expression);
            }
            else if (currentToken == Token.Random) // random(1,2)
            {
                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.OParen)
                {
                    throw new Exceptions.IllegalTokenException(
                              "Illegal Token: Need Open Parenthesis!");
                }

                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.Double)
                {
                    throw new Exceptions.IllegalTokenException(
                              "Illegal token: Need Double Token 1!");
                }
                var minValue = lexicalAnalyzer.CurrentValue;

                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.Comma)
                {
                    throw new Exceptions.IllegalTokenException(
                              "Illegal token: Need Comma Token!");
                }

                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.Double)
                {
                    throw new Exceptions.IllegalTokenException(
                              "Illegal token: Need Double Token 2!");
                }
                var maxValue = lexicalAnalyzer.CurrentValue;

                currentToken = lexicalAnalyzer.GetCurrentToken();
                if (currentToken != Token.CParen)
                {
                    throw new Exceptions.IllegalTokenException(
                              "Missing Closeing Parenthesis!");
                }

                IExpression expression = new RandomExpression((int)minValue,
                                                              (int)maxValue);
                currentToken = lexicalAnalyzer.GetCurrentToken();

                return(expression);
            }
            else
            {
                throw new Exceptions.IllegalTokenException(
                          $"Illegal Token: {currentToken}!");
            }
        }