private DataType visitFactor(FactorContext ctx) {
        if (ctx.expression() != null) {
            return visitExpression(ctx.expression());
        } else if (ctx.functionCall() != null) {
            return visitFunctionCall(ctx.functionCall());
        } else if (ctx.qualifiedName() != null) {
            return visitQualifiedName(ctx.qualifiedName());
        } else if (ctx.NUMBER() != null) {
            mv.visitLdcInsn(Integer.parseInt(ctx.NUMBER().getText()));
            return PrimitiveType.INTEGER;
        } else if (ctx.bool() != null) {
            mv.visitInsn("false".equals(ctx.bool().getText()) ? ICONST_0 : ICONST_1);
            return PrimitiveType.BOOLEAN;
        } else if (ctx.notFactor() != null) {
            return visitNotFactor(ctx.notFactor());
        } else {
            throw new CompileException("Unsupported expression " + ctx.getText());
        }
    }