private static VariableContext DeconstructBinary(
            BinaryOperation op, SymbolMap map, VariableContext output)
        {
            var leftMapChild  = (SymbolMap)map.ChildOrDefault(0);
            var rightMapChild = (SymbolMap)map.ChildOrDefault(1);

            output = Deconstruct(op.Operand1, leftMapChild, output);
            output = Deconstruct(op.Operand2, rightMapChild, output);

            if (leftMapChild == null && rightMapChild == null && map.Value.HasName)
            {
                output.Define(map.Value.Name, op);
            }

            return(output);
        }
        private static VariableContext DeconstructUnary(
            UnaryOperation op, SymbolMap map, VariableContext output)
        {
            var mapChild = (SymbolMap)map.ChildOrDefault(0);

            if (mapChild != null)
            {
                output = Deconstruct(op.Child, mapChild, output);
            }

            if (mapChild == null && map.Value.HasName)
            {
                output.Define(map.Value.Name, op);
            }

            return(output);
        }