private ExpressionNode DExpression() throws SyntaxException {
        try {
            Position pos = iterator.current().coordinates().starting();
            if (iterator.current().type().is(Token.Type.PlusMinus)) {
                switch (iterator.current().type()) {
                    case PLUS:
                        nextToken();
                        return EExpression();
                    case MINUS:
                        nextToken();
                        return new UnaryOperationNode(
                            UnaryOperationNode.Operation.MINUS, 
                            EExpression(), 
                            pos);
                    default:
                        nextToken();
                        return ExpressionNode.InvalidNode(pos);
                }
            } else if (iterator.current().type().is(Token.Type.BITWISE_NOT)) {
                nextToken();
                ExpressionNode node = EExpression();

                return new UnaryOperationNode(
                    UnaryOperationNode.Operation.BITWISE_NOT,
                    node,
                    pos
                );
            } else if (iterator.current().type().is(Token.Type.BOOL_NOT)) {
                nextToken();
                ExpressionNode node = EExpression();

                return new UnaryOperationNode(
                    UnaryOperationNode.Operation.NOT,
                    node,
                    pos
                );
            } else if (iterator.current().type().is(Token.Type.IncDec)) {
                UnaryOperationNode.Operation operation;
                switch (iterator.current().type()) {
                    case INC:
                        operation = UnaryOperationNode.Operation.PRE_INC;
                        break;
                    case DEC:
                        operation = UnaryOperationNode.Operation.PRE_DEC;
                        break;
                    default:
                        return ExpressionNode.InvalidNode(pos);
                }
                nextToken();
                ExpressionNode node = EExpression();

                return new UnaryOperationNode(operation, node, pos);
            } else {
                return RefDeref();
            }
        } catch(SyntaxException ex) {
            throw ex;
        } catch(Exception ex) {
            throw (NonAnalysisException)new NonAnalysisException(ex)
                    .initPosition(iterator.current().coordinates().starting())
                    .Log("ru.bmstu.iu9.compiler.syntax");
        }
    }