Ejemplo n.º 1
0
        public static IExpression Parse(JToken token, ExpressionParser parser)
        {
            if (token == null || !(token is JArray array))
            {
                throw new ArgumentException("");
            }

            var length = array.Count;

            if (length != 2)
            {
                parser.Error("Expected one argument, but found " + length.ToString() + " instead.");
                return(null);
            }

            var input = parser.Parse(array[1], 1);

            if (input == null)
            {
                return(null);
            }

            if (!(input is MGLArrayType) && !(input is MGLStringType) && !(input is MGLValueType))
            {
                parser.Error("Expected argument of type string or array, but found " + input.GetType().ToString() + " instead.");
                return(null);
            }

            return(new LengthExpression(input));
        }
Ejemplo n.º 2
0
        public static IExpression Parse(JToken token, ExpressionParser parser)
        {
            if (token == null || !(token is JArray array))
            {
                throw new ArgumentException("");
            }

            var length = array.Count;

            if (length != 2 || !(array[1].Type == JTokenType.String))
            {
                parser.Error("'var' expression requires exactly one string literal argument.");
                return(null);
            }

            string name = array[1].ToString();

            var bindingValue = parser.Scope.GetBinding(name);

            if (bindingValue == null)
            {
                parser.Error("Unknown variable " + name + ". Make sure " + name + " has been bound in an enclosing \"let\" expression before using it.", 1);
                return(null);
            }

            return(new VarExpression(name, bindingValue));
        }
Ejemplo n.º 3
0
        public static IExpression Parse(JToken token, ExpressionParser parser)
        {
            if (token == null || !(token is JArray array))
            {
                throw new ArgumentException("");
            }

            var length = array.Count;

            if (length < 4)
            {
                parser.Error("Expected at least 3 arguments, but found " + (length - 1).ToString() + " instead.");
                return(null);
            }

            Dictionary <string, IExpression> bindings = new Dictionary <string, IExpression>();

            for (var i = 1; i < length - 1; i += 2)
            {
                var name = array[i].ToString();
                if (string.IsNullOrEmpty(name))
                {
                    parser.Error("Expected string, but found " + array[i].GetType().ToString() + " instead.", i);
                    return(null);
                }

                bool isValidName = name.All(c => (c >= 48 && c <= 57 || c >= 65 && c <= 90 || c >= 97 && c <= 122 || c == '_'));

                if (!isValidName)
                {
                    parser.Error("Variable names must contain only alphanumeric characters or '_'.", 1);
                    return(null);
                }

                var bindingValue = parser.Parse(array[i + 1], null);

                if (bindingValue == null)
                {
                    return(null);
                }

                bindings.Add(name, bindingValue);
            }

            var result = parser.Parse(array[length - 1], length - 1, parser.Expected, bindings);

            if (result == null)
            {
                return(null);
            }

            return(new LetExpression(bindings, result));
        }
Ejemplo n.º 4
0
        public static IExpression Parse(JArray array, ExpressionParser parser)
        {
            if (array == null)
            {
                throw new ArgumentException("");
            }

            var length = array.Count;

            if (length != 3)
            {
                parser.Error($"Expected 2 arguments, but found {length - 1} instead.");

                return(null);
            }

            var index     = parser.Parse(array[1], 1, typeof(MGLNumberType));
            var inputType = parser.Expected != null ? parser.Expected : typeof(MGLValueType);
            var input     = parser.Parse(array[2], 2, inputType);

            if (index == null || input == null)
            {
                return(null);
            }

            return(new AtExpression(index, input));
        }