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)); }
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)); }
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)); }
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)); }