private VariableOperand generateAssignment(BinaryOperationNode node)
            throws IRException {

        try {
            VariableOperand lhv = generateLeftHandValue(node.leftChild());
            Operand rhv = generateRightHandValue(node.rightChild());

            if(node.leftChild() instanceof VariableLeaf) {
                code.addStatement(new AssignmentStatement(lhv, rhv));

                return lhv;
            } else {
                code.addStatement(new IndirectAssignmentStatement(lhv, rhv));

                TmpVariableOperand value =
                    new TmpVariableOperand(
                        ((PointerType)lhv.type()).pointerType,
                        varTable);

                code.addStatement(
                    new UnaryOperationStatement(
                        value,
                        lhv,
                        UnaryOperationStatement.Operation.DEREF)
                );

                return value;
            }
        } catch(IRException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonGenerationException)new NonGenerationException(ex)
                    .Log("ru.bmstu.iu9.compiler.ir");
        }
    }