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); }
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}!"); } }