public override bool Evaluate(RuntimeValues runtimeEnv)
        {
            object leftVal  = left.GetRuntimeValue(runtimeEnv);
            object rightVal = right.GetRuntimeValue(runtimeEnv);

            IComparer comparer = new CaseInsensitiveComparer(CultureInfo.InvariantCulture);

            int compare;

            if (leftVal is IComparable)
            {
                compare = comparer.Compare(leftVal, rightVal);
            }
            else if (rightVal is IComparable)
            {
                compare = -comparer.Compare(rightVal, leftVal);
            }
            else
            {
                // Only do this if neither version is comparable.
                // The reason is IComparable objects can change the
                // meaning of Equals in surprising ways if necessary,
                // such as for version matching.
                if (opToken == XppTokenType.EQ)
                {
                    return(Equals(leftVal, rightVal));
                }
                if (opToken == XppTokenType.NEQ)
                {
                    return(!Equals(leftVal, rightVal));
                }

                throw new ArgumentException("Can't perform a compare on two objects that don't implement IComparable");
            }

            switch (opToken)
            {
            case XppTokenType.LT:
                return(compare < 0);

            case XppTokenType.LTE:
                return(compare <= 0);

            case XppTokenType.EQ:
                return(compare == 0);

            case XppTokenType.NEQ:
                return(compare != 0);

            case XppTokenType.GT:
                return(compare > 0);

            case XppTokenType.GTE:
                return(compare >= 0);

            default:
                throw new ArgumentException("Program error: Unexpected comparison operator in XppCompareExpr");
            }
        }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     if (_or)
     {
         return(_left.Evaluate(runtimeEnv) || _right.Evaluate(runtimeEnv));
     }
     else
     {
         return(_left.Evaluate(runtimeEnv) && _right.Evaluate(runtimeEnv));
     }
 }
        public override bool Evaluate(RuntimeValues runtimeEnv)
        {
            Regex  regex;
            object patternObj = pattern.GetRuntimeValue(runtimeEnv);

            if (patternObj is string)
            {
                regex = new Regex((string)patternObj, DEFAULT_REGEX_OPTIONS);
            }
            else if (patternObj is Regex)
            {
                regex = (Regex)patternObj;
            }
            else
            {
                throw new ArgumentException("Right-hand side of regex operator wasn't a string or regex");
            }

            return(not ^ regex.IsMatch(val.GetRuntimeValue(runtimeEnv).ToString()));
        }
 public object GetRuntimeValue(RuntimeValues runtimeEnv)
 {
     if (TokenType == XppTokenType.Identifier)
     {
         return(runtimeEnv.Get(Value));
     }
     else if (TokenType == XppTokenType.StringLiteral)
     {
         return(Value);
     }
     else if (TokenType == XppTokenType.VersionLiteral)
     {
         return(new Version(Value));
     }
     else if (TokenType == XppTokenType.RegexLiteral)
     {
         return(new Regex(Value, XppRegexExpr.DEFAULT_REGEX_OPTIONS));
     }
     else
     {
         throw new ArgumentException("Program error: Cannot get value for something that is not an identifier, string, or version");
     }
 }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     return(val);
 }
 public bool Evaluate(RuntimeValues runtimeEnv)
 {
     return(Parse().Evaluate(runtimeEnv));
 }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     return(!expr.Evaluate(runtimeEnv));
 }
 public abstract bool Evaluate(RuntimeValues runtimeEnv);
        public override bool Evaluate(RuntimeValues runtimeEnv)
        {
            object leftVal = left.GetRuntimeValue(runtimeEnv);
            object rightVal = right.GetRuntimeValue(runtimeEnv);

            IComparer comparer = new CaseInsensitiveComparer(CultureInfo.InvariantCulture);

            int compare;
            if (leftVal is IComparable)
                compare = comparer.Compare(leftVal, rightVal);
            else if (rightVal is IComparable)
                compare = -comparer.Compare(rightVal, leftVal);
            else
            {
                // Only do this if neither version is comparable.
                // The reason is IComparable objects can change the
                // meaning of Equals in surprising ways if necessary,
                // such as for version matching.
                if (opToken == XppTokenType.EQ)
                    return Equals(leftVal, rightVal);
                if (opToken == XppTokenType.NEQ)
                    return !Equals(leftVal, rightVal);

                throw new ArgumentException("Can't perform a compare on two objects that don't implement IComparable");
            }

            switch (opToken)
            {
                case XppTokenType.LT:
                    return compare < 0;
                case XppTokenType.LTE:
                    return compare <= 0;
                case XppTokenType.EQ:
                    return compare == 0;
                case XppTokenType.NEQ:
                    return compare != 0;
                case XppTokenType.GT:
                    return compare > 0;
                case XppTokenType.GTE:
                    return compare >= 0;
                default:
                    throw new ArgumentException("Program error: Unexpected comparison operator in XppCompareExpr");
            }
        }
        public override bool Evaluate(RuntimeValues runtimeEnv)
        {
            Regex regex;
            object patternObj = pattern.GetRuntimeValue(runtimeEnv);
            if (patternObj is string)
            {
                regex = new Regex((string)patternObj, DEFAULT_REGEX_OPTIONS);
            }
            else if (patternObj is Regex)
            {
                regex = (Regex)patternObj;
            }
            else
            {
                throw new ArgumentException("Right-hand side of regex operator wasn't a string or regex");
            }

            return not ^ regex.IsMatch(val.GetRuntimeValue(runtimeEnv).ToString());
        }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     return val;
 }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     if (_or)
         return _left.Evaluate(runtimeEnv) || _right.Evaluate(runtimeEnv);
     else
         return _left.Evaluate(runtimeEnv) && _right.Evaluate(runtimeEnv);
 }
 public bool Evaluate(RuntimeValues runtimeEnv)
 {
     return Parse().Evaluate(runtimeEnv);
 }
 public override bool Evaluate(RuntimeValues runtimeEnv)
 {
     return !expr.Evaluate(runtimeEnv);
 }
 public abstract bool Evaluate(RuntimeValues runtimeEnv);
 public object GetRuntimeValue(RuntimeValues runtimeEnv)
 {
     if (TokenType == XppTokenType.Identifier)
         return runtimeEnv.Get(Value);
     else if (TokenType == XppTokenType.StringLiteral)
         return Value;
     else if (TokenType == XppTokenType.VersionLiteral)
         return new Version(Value);
     else if (TokenType == XppTokenType.RegexLiteral)
         return new Regex(Value, XppRegexExpr.DEFAULT_REGEX_OPTIONS);
     else
         throw new ArgumentException("Program error: Cannot get value for something that is not an identifier, string, or version");
 }