internal static void AssertThrows(ExpressionOptimizer optimizer, Expression original, Type exceptionType)
        {
            var res = optimizer.Visit(original);

            Assert.AreEqual(ExpressionType.Throw, res.NodeType);
            Assert.AreEqual(exceptionType, ((UnaryExpression)res).Operand.Type);
        }
示例#2
0
 /// <summary>
 /// 実際に実行する部分。
 /// </summary>
 protected virtual object ExecuteCore(TextReader stream, string filename)
 {
     Contract.Requires <ArgumentNullException>(stream != null);
     Contract.Requires <ArgumentNullException>(filename != null);
     Initialize();
     Func <Scope, object> program;
     {
         // Compile
         var sw    = Stopwatch.StartNew();
         var token = Tokenizer.Tokenize(stream, filename);
         var ast   = Parser.Parse(token, filename);
         var expr  = ExpressionGenerator.Generate(ast, this.Factory, filename);
         expr    = ExpressionOptimizer.Analyze(expr);
         program = CompilerHelpers.Compile(expr, true);
         //program = expr.Compile();
         sw.Stop();
         var ev = OnCompiled;
         if (ev != null)
         {
             ev(this, new EngineEventArgs(sw.ElapsedMilliseconds));
         }
     }
     {
         // Execute
         var sw     = Stopwatch.StartNew();
         var result = program(this.Global);
         sw.Stop();
         var ev = OnExecuted;
         if (ev != null)
         {
             ev(this, new EngineEventArgs(sw.ElapsedMilliseconds));
         }
         return(result);
     }
 }
示例#3
0
        static void Main(string[] args)
        {
            var procElementsNumber = 4;

            while (true)
            {
                Console.WriteLine("Enter expression:");
                var expression = Console.ReadLine();
                try {
                    var result = Parser.Parse(expression);
                    if (result == null)
                    {
                        Console.WriteLine("FAILED");
                        continue;
                    }

                    Console.WriteLine("OK");
                    Console.WriteLine($"Result : {result.Eval()}");
                    Console.WriteLine($"Height : {result.GetHeight()}");
                    result.Print();

                    Console.WriteLine("Optimized:");
                    var optimized = ExpressionOptimizer.Optimize(result);
                    Console.WriteLine($"Result : {optimized.Eval()}");
                    Console.WriteLine($"Height : {optimized.GetHeight()}");
                    optimized.Print();

                    Console.WriteLine("Data Flow:");

                    PrintHeader("SEQUENTIAL");

                    var sequentialSystem = DataFlowSystem.BuildSystem(optimized, 1);
                    DataFlowHelper.PrintSystem(sequentialSystem);
                    var sequentialSystemResult = sequentialSystem.Start();
                    DataFlowHelper.PrintSystemResult(sequentialSystemResult);


                    PrintHeader("PARALLEL");

                    var parallelSystem = DataFlowSystem.BuildSystem(optimized, procElementsNumber);
                    DataFlowHelper.PrintSystem(parallelSystem);
                    var parallelSystemResult = parallelSystem.Start();
                    DataFlowHelper.PrintSystemResult(parallelSystemResult);

                    Console.WriteLine();

                    var acceleration = (double)sequentialSystemResult.Ticks / parallelSystemResult.Ticks;
                    var efficient    = (double)acceleration / procElementsNumber;
                    PrintHeader($"ACCELERATION: {acceleration}, EFFICIENT: {efficient}");
                }
                catch (Exception e) {
                    Console.WriteLine(e);
                }
            }
        }
示例#4
0
        public void Optimize_Fails(string input, string expected)
        {
            ITokenizer tokenizer = new Tokenizer(input);
            IParser    parser    = new Parser(tokenizer, _context);
            IExpressionVisitor <IExpression> optimizer = new ExpressionOptimizer(_context);

            IExpression parsedExpr    = parser.Parse();
            IExpression optimizedExpr = optimizer.Visit(parsedExpr);
            string      actual        = optimizedExpr.ToString();

            Assert.AreNotEqual(expected, actual);
        }
示例#5
0
        public void NewArrayInit_AllConstant()
        {
            var o = new ExpressionOptimizer(new MetadataSemanticProvider {
                PureMembers = PureMemberCatalog.All, ConstParameters = ConstParameterCatalog.All, ImmutableTypes = ImmutableTypeCatalog.All
            }, new DefaultEvaluatorFactory());

            var e =
                Expression.Call(
                    typeof(Convert).GetMethod(nameof(Convert.ToBase64String), new[] { typeof(byte[]) }),
                    Expression.NewArrayInit(
                        typeof(byte),
                        Expression.Constant((byte)1, typeof(byte)),
                        Expression.Constant((byte)2, typeof(byte))
                        )
                    );

            var r = o.Visit(e);

            Assert.IsTrue(r is ConstantExpression c && c.Value is string s && s == Convert.ToBase64String(new byte[] { 1, 2 }));
        }
示例#6
0
 public MathEBNFGrammarCompiler(IStartSymbol startSymbol)
     : base(startSymbol)
 {
     this.optimizer = new ExpressionOptimizer(15);
 }
        internal static void AssertOptimized(ExpressionOptimizer optimizer, Expression original, Expression expected)
        {
            var res = optimizer.Visit(original);

            AreEqual(expected, res);
        }
 public ExpressionOptimizerTests()
 {
     this.expressionOptimizer2 = new ExpressionOptimizer(15);
 }