public override IExpressionNode VisitLogicalExpression([NotNull] QLanguageParser.LogicalExpressionContext context)
        {
            var logicalEntityContext = context.logicalEntity();

            if (logicalEntityContext != null)
            {
                return(VisitLogicalEntity(logicalEntityContext));
            }


            var logicalExpressionContext = context.logicalExpression();

            if (logicalExpressionContext != null && logicalExpressionContext.Length == 1)
            {
                return(VisitLogicalExpression(logicalExpressionContext[0]));
            }

            var comparisonExpressionContext = context.comparisonExpression();

            if (comparisonExpressionContext != null)
            {
                return(new ComparisonExpressionVisitor().VisitComparisonExpression(comparisonExpressionContext));
            }

            var left  = VisitLogicalExpression(context.LEFT);
            var opr   = LogicalExpressionNode.ParseLogicalOperator(context.OPR.Text);
            var right = VisitLogicalExpression(context.RIGHT);

            return(new LogicalExpressionNode(Location.FromContext(context), left, opr, right));;
        }
        public override IExpressionNode VisitLogicalExpression(LogicalExpressionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("Context can't be null");
            }

            var logicalEntityContext = context.logicalEntity();

            if (logicalEntityContext != null)
            {
                return(VisitLogicalEntity(logicalEntityContext));
            }

            var logicalExpressionContext = context.logicalExpression();

            if (logicalExpressionContext != null && logicalExpressionContext.Length == 1)
            {
                return(VisitLogicalExpression(logicalExpressionContext[0]));
            }

            var comparisonExpressionContext = context.comparisonExpression();

            if (comparisonExpressionContext != null)
            {
                return(new ComparisonExpressionVisitor().VisitComparisonExpression(comparisonExpressionContext));
            }

            var left  = VisitLogicalExpression(context.LEFT);
            var opr   = LogicalExpressionNode.ParseLogicalOperator(context.OPR.Text);
            var right = VisitLogicalExpression(context.RIGHT);

            return(new LogicalExpressionNode(Location.FromContext(context), left, opr, right));;
        }