/// <summary> /// Parses typed literals. /// </summary> /// <param name="lexer">The lexer to use.</param> /// <param name="targetType">Expected type to be parsed.</param> /// <param name="targetTypeName">The EDM type name of the expected type to be parsed.</param> /// <returns>The literal token produced by building the given literal.</returns> private static LiteralQueryToken ParseTypedLiteral(ExpressionLexer lexer, Type targetType, string targetTypeName) { Debug.Assert(lexer != null, "lexer != null"); object targetValue; if (!UriPrimitiveTypeParser.TryUriStringToPrimitive(lexer.CurrentToken.Text, targetType, out targetValue)) { string message = Strings.UriQueryExpressionParser_UnrecognizedLiteral( targetTypeName, lexer.CurrentToken.Text, lexer.CurrentToken.Position, lexer.ExpressionText); throw ParseError(message); } LiteralQueryToken result = new LiteralQueryToken() { Value = targetValue, OriginalText = lexer.CurrentToken.Text }; lexer.NextToken(); return(result); }
/// <summary> /// Parses null literals. /// </summary> /// <param name="lexer">The lexer to use.</param> /// <returns>The literal token produced by building the given literal.</returns> private static LiteralQueryToken ParseNullLiteral(ExpressionLexer lexer) { Debug.Assert(lexer != null, "lexer != null"); Debug.Assert(lexer.CurrentToken.Kind == ExpressionTokenKind.NullLiteral, "this.lexer.CurrentToken.Kind == ExpressionTokenKind.NullLiteral"); LiteralQueryToken result = new LiteralQueryToken() { Value = null, OriginalText = lexer.CurrentToken.Text }; lexer.NextToken(); return(result); }
/// <summary>Attempts to parse key values from the specified text.</summary> /// <param name='text'>Text to parse (not null).</param> /// <returns> /// Enumeration of key values or null if there was a syntax error. /// </returns> /// <remarks> /// The returned instance contains only string values. /// </remarks> private static IEnumerable<NamedValue> ParseKeyValuesFromUri(string text) { Debug.Assert(text != null, "text != null"); //// This is a modified copy of KeyInstance.TryParseFromUri ExpressionLexer lexer = new ExpressionLexer(text); ExpressionToken currentToken = lexer.CurrentToken; if (currentToken.Kind == ExpressionTokenKind.End) { return EmptyKeyValues; } List<NamedValue> keyValuesList = new List<NamedValue>(); do { if (currentToken.Kind == ExpressionTokenKind.Identifier) { // Name-value pair. string identifier = lexer.CurrentToken.GetIdentifier(); lexer.NextToken(); if (lexer.CurrentToken.Kind != ExpressionTokenKind.Equal) { return null; } lexer.NextToken(); if (!lexer.CurrentToken.IsKeyValueToken) { return null; } keyValuesList.Add(new NamedValue() { Name = identifier, Value = ParseKeyValueLiteral(lexer) }); } else if (currentToken.IsKeyValueToken) { // Unnamed value. keyValuesList.Add(new NamedValue() { Value = ParseKeyValueLiteral(lexer) }); } else { return null; } // Read the next token. We should be at the end, or find // we have a comma followed by something. currentToken = lexer.NextToken(); if (currentToken.Kind == ExpressionTokenKind.Comma) { currentToken = lexer.NextToken(); if (currentToken.Kind == ExpressionTokenKind.End) { // Trailing comma. return null; } } } while (currentToken.Kind != ExpressionTokenKind.End); return keyValuesList; }
/// <summary>Attempts to parse key values from the specified text.</summary> /// <param name='text'>Text to parse (not null).</param> /// <returns> /// Enumeration of key values or null if there was a syntax error. /// </returns> /// <remarks> /// The returned instance contains only string values. /// </remarks> private static IEnumerable <NamedValue> ParseKeyValuesFromUri(string text) { Debug.Assert(text != null, "text != null"); //// This is a modified copy of KeyInstance.TryParseFromUri ExpressionLexer lexer = new ExpressionLexer(text); ExpressionToken currentToken = lexer.CurrentToken; if (currentToken.Kind == ExpressionTokenKind.End) { return(EmptyKeyValues); } List <NamedValue> keyValuesList = new List <NamedValue>(); do { if (currentToken.Kind == ExpressionTokenKind.Identifier) { // Name-value pair. string identifier = lexer.CurrentToken.GetIdentifier(); lexer.NextToken(); if (lexer.CurrentToken.Kind != ExpressionTokenKind.Equal) { return(null); } lexer.NextToken(); if (!lexer.CurrentToken.IsKeyValueToken) { return(null); } keyValuesList.Add(new NamedValue() { Name = identifier, Value = ParseKeyValueLiteral(lexer) }); } else if (currentToken.IsKeyValueToken) { // Unnamed value. keyValuesList.Add(new NamedValue() { Value = ParseKeyValueLiteral(lexer) }); } else { return(null); } // Read the next token. We should be at the end, or find // we have a comma followed by something. currentToken = lexer.NextToken(); if (currentToken.Kind == ExpressionTokenKind.Comma) { currentToken = lexer.NextToken(); if (currentToken.Kind == ExpressionTokenKind.End) { // Trailing comma. return(null); } } }while (currentToken.Kind != ExpressionTokenKind.End); return(keyValuesList); }
/// <summary> /// Parses null literals. /// </summary> /// <param name="lexer">The lexer to use.</param> /// <returns>The literal token produced by building the given literal.</returns> private static LiteralQueryToken ParseNullLiteral(ExpressionLexer lexer) { Debug.Assert(lexer != null, "lexer != null"); Debug.Assert(lexer.CurrentToken.Kind == ExpressionTokenKind.NullLiteral, "this.lexer.CurrentToken.Kind == ExpressionTokenKind.NullLiteral"); LiteralQueryToken result = new LiteralQueryToken() { Value = null, OriginalText = lexer.CurrentToken.Text }; lexer.NextToken(); return result; }
/// <summary> /// Parses typed literals. /// </summary> /// <param name="lexer">The lexer to use.</param> /// <param name="targetType">Expected type to be parsed.</param> /// <param name="targetTypeName">The EDM type name of the expected type to be parsed.</param> /// <returns>The literal token produced by building the given literal.</returns> private static LiteralQueryToken ParseTypedLiteral(ExpressionLexer lexer, Type targetType, string targetTypeName) { Debug.Assert(lexer != null, "lexer != null"); object targetValue; if (!UriPrimitiveTypeParser.TryUriStringToPrimitive(lexer.CurrentToken.Text, targetType, out targetValue)) { string message = Strings.UriQueryExpressionParser_UnrecognizedLiteral( targetTypeName, lexer.CurrentToken.Text, lexer.CurrentToken.Position, lexer.ExpressionText); throw ParseError(message); } LiteralQueryToken result = new LiteralQueryToken() { Value = targetValue, OriginalText = lexer.CurrentToken.Text }; lexer.NextToken(); return result; }