private static int ExtractLiteral(string fullExpression, string tokenBegin, ExpressionEvaluator.Token token) { int num = 0; int num1 = 1; char chr = (token.Type == ExpressionEvaluator.TokenType.SingleLiteral ? '\'' : '\"'); bool flag = false; while (true) { num = tokenBegin.IndexOf(chr, num1); if (num == -1) { CultureInfo invariantCulture = CultureInfo.InvariantCulture; object[] objArray = new object[] { fullExpression, tokenBegin }; throw new InvalidDataContractException(string.Format(invariantCulture, "Expression is {0}. Literal is missing closing notation. Current invalid token is {1}", objArray)); } if (num + 1 >= tokenBegin.Length || tokenBegin[num + 1] != chr) { break; } flag = true; num1 = num + 2; } string str = tokenBegin.Substring(1, num - 1); if (!flag) { token.Property = str; } else { token.Property = (token.Type == ExpressionEvaluator.TokenType.DoubleLiteral ? str.Replace("\"\"", "\"") : str.Replace("''", "'")); } return(num); }
private static int ExtractToken(string fullExpression, string tokenBegin, ExpressionEvaluator.Token token) { if (tokenBegin[1] != '(') { CultureInfo invariantCulture = CultureInfo.InvariantCulture; object[] objArray = new object[] { fullExpression, tokenBegin }; throw new InvalidDataContractException(string.Format(invariantCulture, "Expression is {0}. The character following $ or . or % should be a ( The current invalid token is {1}", objArray)); } int num = tokenBegin.IndexOf(','); int num1 = tokenBegin.IndexOf(')'); if (num1 == -1) { CultureInfo cultureInfo = CultureInfo.InvariantCulture; object[] objArray1 = new object[] { fullExpression, tokenBegin }; throw new InvalidDataContractException(string.Format(cultureInfo, "Expression is {0}. Missing closing parentheses. Current invalid token is {1}", objArray1)); } if ((token.Type == ExpressionEvaluator.TokenType.Percentage || token.Type == ExpressionEvaluator.TokenType.Hash) && num != -1 && num < num1) { CultureInfo invariantCulture1 = CultureInfo.InvariantCulture; object[] objArray2 = new object[] { fullExpression, tokenBegin }; throw new InvalidDataContractException(string.Format(invariantCulture1, "Expression is {0}. The expression %(prop , n) is not a valid. The current invalid token is {1}", objArray2)); } if (token.Type == ExpressionEvaluator.TokenType.Dot && num == -1) { CultureInfo cultureInfo1 = CultureInfo.InvariantCulture; object[] objArray3 = new object[] { fullExpression, tokenBegin }; throw new InvalidDataContractException(string.Format(cultureInfo1, "Expression is {0}. Error trying to parse for .(prop , n) format. The current invalid token is {1}", objArray3)); } int num2 = 0; if (num == -1 || num >= num1) { token.Property = tokenBegin.Substring(2, num1 - 2); } else { string str = tokenBegin.Substring(num + 1, num1 - num - 1); if (!int.TryParse(str, out num2) || num2 < 0) { CultureInfo invariantCulture2 = CultureInfo.InvariantCulture; object[] objArray4 = new object[] { fullExpression, tokenBegin, str }; throw new InvalidDataContractException(string.Format(invariantCulture2, "Expression is {0}. {2} is not a positive integer. The current invalid token is {1}", objArray4)); } if (num2 == 0) { token.EmptyString = true; } token.Length = num2; token.Property = tokenBegin.Substring(2, num - 2); } token.Property = token.Property.Trim(); return(num1); }
private static List <ExpressionEvaluator.Token> ValidateAndTokenize(string expression, out ExpressionEvaluator.ExpressionType expressionType) { int length; object[] objArray; CultureInfo invariantCulture; expressionType = ExpressionEvaluator.PeekExpressionType(expression); if ((int)expressionType == 0) { return(new List <ExpressionEvaluator.Token>()); } List <ExpressionEvaluator.Token> tokens = new List <ExpressionEvaluator.Token>(); string str = expression; if ((int)expressionType == 3) { if (expression[expression.Length - 1] != '}') { CultureInfo cultureInfo = CultureInfo.InvariantCulture; object[] objArray1 = new object[] { expression }; throw new InvalidDataContractException(string.Format(cultureInfo, "Expression is {0}. Error is closing parenthesis is missing", objArray1)); } str = expression.Substring(1, expression.Length - 2).TrimEnd(new char[0]); } while (true) { ExpressionEvaluator.Token token1 = new ExpressionEvaluator.Token(); str = str.TrimStart(new char[0]); if (str.Length < 3) { CultureInfo invariantCulture1 = CultureInfo.InvariantCulture; object[] objArray2 = new object[] { expression, str }; throw new InvalidDataContractException(string.Format(invariantCulture1, "Expression is {0}. Error is it contains an invalid token : {1}", objArray2)); } char chr = str[0]; switch (chr) { case '\"': { token1.Type = ExpressionEvaluator.TokenType.DoubleLiteral; length = ExpressionEvaluator.ExtractLiteral(expression, str, token1); break; } case '#': { token1.Type = ExpressionEvaluator.TokenType.Hash; length = ExpressionEvaluator.ExtractToken(expression, str, token1); break; } case '$': { if (!str.ToLowerInvariant().StartsWith("$body", StringComparison.OrdinalIgnoreCase)) { token1.Type = ExpressionEvaluator.TokenType.Dollar; length = ExpressionEvaluator.ExtractToken(expression, str, token1); break; } else { length = "$body".Length - 1; token1.Type = ExpressionEvaluator.TokenType.Body; break; } } case '%': { token1.Type = ExpressionEvaluator.TokenType.Percentage; length = ExpressionEvaluator.ExtractToken(expression, str, token1); break; } case '&': { invariantCulture = CultureInfo.InvariantCulture; objArray = new object[] { expression, str }; throw new InvalidDataContractException(string.Format(invariantCulture, "Expression is {0}. Token has to begin with one of these characters . % ' \" $. Current invalid token is {1}", objArray)); } case '\'': { token1.Type = ExpressionEvaluator.TokenType.SingleLiteral; length = ExpressionEvaluator.ExtractLiteral(expression, str, token1); break; } default: { if (chr != '.') { invariantCulture = CultureInfo.InvariantCulture; objArray = new object[] { expression, str }; throw new InvalidDataContractException(string.Format(invariantCulture, "Expression is {0}. Token has to begin with one of these characters . % ' \" $. Current invalid token is {1}", objArray)); } token1.Type = ExpressionEvaluator.TokenType.Dot; length = ExpressionEvaluator.ExtractToken(expression, str, token1); break; } } if (token1.Type != ExpressionEvaluator.TokenType.SingleLiteral && token1.Type != ExpressionEvaluator.TokenType.DoubleLiteral && token1.Type != ExpressionEvaluator.TokenType.Body && !string.Equals(token1.Property, "$body", StringComparison.OrdinalIgnoreCase)) { if (!ExpressionEvaluator.PropertyNameRegEx.IsMatch(token1.Property)) { CultureInfo cultureInfo1 = CultureInfo.InvariantCulture; object[] property = new object[] { token1.Property }; throw new InvalidDataContractException(string.Format(cultureInfo1, "Property name is {0}. Only ASCII-7 alphanumeric characters and '_' are permitted in the property name", property)); } if (token1.Property.Length > 120) { CultureInfo invariantCulture2 = CultureInfo.InvariantCulture; object[] length1 = new object[] { token1.Property.Length, 120 }; throw new InvalidDataContractException(string.Format(invariantCulture2, "Property name is of length. {0}. Maximum allowed length is {1}", length1)); } } tokens.Add(token1); if (str.Length == length + 1) { if (tokens.Count > 1) { if (tokens.Find((ExpressionEvaluator.Token token) => token.Type == ExpressionEvaluator.TokenType.Hash) != null) { throw new InvalidDataContractException(string.Format(CultureInfo.InvariantCulture, "Token type '#(prop)' is not allowed in composite expression.", new object[0])); } } return(tokens); } str = str.Substring(length + 1).TrimStart(new char[0]); if (str[0] != '+') { CultureInfo cultureInfo2 = CultureInfo.InvariantCulture; object[] objArray3 = new object[] { expression, str }; throw new InvalidDataContractException(string.Format(cultureInfo2, "Expression is {0}. Only valid composition operator is +. Current invalid token is : {1}", objArray3)); } str = str.Substring(1); } invariantCulture = CultureInfo.InvariantCulture; objArray = new object[] { expression, str }; throw new InvalidDataContractException(string.Format(invariantCulture, "Expression is {0}. Token has to begin with one of these characters . % ' \" $. Current invalid token is {1}", objArray)); }