Exemple #1
0
        public override ObjectType VisitRelationalExpression(QuestScriptParser.RelationalExpressionContext context)
        {
            var leftType  = context.left.Accept(this);
            var rightType = context.right.Accept(this);

            if (TypeUtil.IsComparable(leftType) && TypeUtil.IsComparable(rightType))
            {
                return(ObjectType.Boolean); //comparison results are boolean of course...
            }
            _scriptEnvironmentBuilder.Errors.Add(new InvalidOperandsException(context, context.op.GetText(), leftType,
                                                                              rightType));
            return(ObjectType.Unknown);
        }
        public override Lazy <object> VisitRelationalExpression(QuestScriptParser.RelationalExpressionContext context)
        {
            var leftType  = _scriptEnvironmentBuilder.TypeInferenceVisitor.Visit(context.left);
            var rightType = _scriptEnvironmentBuilder.TypeInferenceVisitor.Visit(context.right);

            if (!TypeUtil.IsComparable(leftType) ||
                !TypeUtil.IsComparable(rightType))
            {
                _scriptEnvironmentBuilder.Errors.Add(new InvalidOperandsException(context, context.op.GetText(),
                                                                                  leftType, rightType));
                return(new Lazy <object>(() => null));
            }

            return(new Lazy <object>(() =>
            {
                var left = context.left.Accept(this).Value.GetValueOrLazyValue();
                var right = context.right.Accept(this).Value.GetValueOrLazyValue();

                switch (context.op.GetText())
                {
                case ">":
                    return Cast((dynamic)left > (dynamic)right, ObjectType.Boolean);

                case ">=":
                    return Cast((dynamic)left >= (dynamic)right, ObjectType.Boolean);

                case "<":
                    return Cast((dynamic)left < (dynamic)right, ObjectType.Boolean);

                case "<=":
                    return Cast((dynamic)left <= (dynamic)right, ObjectType.Boolean);

                case "=":
                    return Cast((dynamic)left == (dynamic)right, ObjectType.Boolean);

                case "<>":     //alternate "not equals"
                case "!=":
                    return Cast((dynamic)left != (dynamic)right, ObjectType.Boolean);
                }

                return true;
            }));
        }
 public override bool VisitRelationalExpression(QuestScriptParser.RelationalExpressionContext context)
 {
     PrintBoolean(context.left, context.op.GetText(), context.right);
     return(true);
 }