public static void PrintTree(TreeNode tree, string spacing)
 {
     if (tree.Op != null)
     {
         Console.WriteLine(spacing + "+" + tree.Op);
         PrintTree(tree.Left, spacing + " ");
         PrintTree(tree.Right, spacing + " ");
     }
     else
         Console.WriteLine(spacing + tree.Value);
 }
 public static void PrintTree(TreeNode tree)
 {
     PrintTree(tree, "");
 }
        public static int Execute(TreeNode root)
        {
            DynamicMethod method = new DynamicMethod("Exec_" + i++,
                                                     typeof(int),
                                                     new Type[] { },
                                                     typeof(Program).Module);

            ILGenerator generator = method.GetILGenerator();

            ILStack = new Stack<MathOpOrVal>();
            BuildStack(ILStack, root);

            while (ILStack.Count > 0)
            {
                MathOpOrVal mv = ILStack.Pop();
                if (mv.Op != null)
                {
                    switch (mv.Op)
                    {
                        case MathOp.Add:
                            Console.WriteLine("add");
                            generator.Emit(OpCodes.Add);
                            break;

                        case MathOp.Sub:
                            Console.WriteLine("sub");
                            generator.Emit(OpCodes.Sub);
                            break;

                        case MathOp.Mul:
                            Console.WriteLine("mul");
                            generator.Emit(OpCodes.Mul);
                            break;

                        case MathOp.Div:
                            Console.WriteLine("div");
                            generator.Emit(OpCodes.Div);
                            break;
                    }
                }
                else
                {
                    Console.WriteLine("ldc " + mv.Value.Value);
                    generator.Emit(OpCodes.Ldc_I4, mv.Value.Value);
                }
            }

            generator.Emit(OpCodes.Ret);

            return (int)method.Invoke(null,
                                      BindingFlags.ExactBinding,
                                      null,
                                      new object[] { },
                                      null);
        }
 public TreeNode(MathOp op, TreeNode left, TreeNode right)
 {
     Op = op;
     Left = left;
     Right = right;
 }
 public static void BuildStack(Stack<MathOpOrVal> stack, TreeNode root)
 {
     if (root.Op != null)
     {
         MathOpOrVal mv = new MathOpOrVal(root.Op.Value);
         stack.Push(mv);
         BuildStack(stack, root.Right);
         BuildStack(stack, root.Left);
     }
     else
     {
         MathOpOrVal mv = new MathOpOrVal(root.Value.Value);
         stack.Push(mv);
     }
 }