private static TResult CompileCommon <TResult>(string commandText, Perspective perspective, ParserOptions parserOptions, Func <AST.Node, ParserOptions, TResult> compilationFunction) where TResult : class { TResult result = null; // // Validate arguments // EntityUtil.CheckArgumentNull(perspective, "commandText"); EntityUtil.CheckArgumentNull(perspective, "perspective"); // // Validate parser options - if null, give default options // parserOptions = parserOptions ?? new ParserOptions(); // // Invoke Parser // AST.Node astCommand = Parse(commandText, parserOptions); // // Perform Semantic Analysis/Conversion // result = compilationFunction(astCommand, parserOptions); return(result); }
/// <summary> /// Parse eSQL command string into an AST /// </summary> /// <param name="commandText">eSQL command</param> /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param> /// <returns>Ast</returns> /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted</exception> /// <remarks> /// This method is not thread safe. /// </remarks> /// <seealso cref="ParserOptions"/> private static AST.Node Parse(string commandText, ParserOptions parserOptions) { AST.Node astExpr = null; // // commandText and parserOptions are validated inside of CqlParser // // // Create Parser // CqlParser cqlParser = new CqlParser(parserOptions, true); // // Invoke parser // astExpr = cqlParser.Parse(commandText); if (null == astExpr) { throw EntityUtil.EntitySqlError(commandText, System.Data.Entity.Strings.InvalidEmptyQuery, 0); } return(astExpr); }
/// <summary> /// Performs semantic conversion, validation on a command AST and creates a <see cref="DbCommandTree"/> /// </summary> /// <param name="astExpr">Abstract Syntax Tree of the command</param> /// <param name="perspective">perspective</param> /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param> /// <param name="parameters">ordinary command parameters</param> /// <returns>a parse result with a valid command tree</returns> /// <remarks>Parameters name/types must be bound before invoking this method</remarks> /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted.</exception> /// <exception cref="System.Data.MetadataException">Thrown as inner exception of a EntityException when metadata related service requests fail.</exception> /// <exception cref="System.Data.MappingException">Thrown as inner exception of a EntityException when mapping related service requests fail.</exception> /// <remarks> /// This method is not thread safe. /// </remarks> /// <seealso cref="ParserOptions"/> /// <seealso cref="DbCommandTree"/> private static ParseResult AnalyzeCommandSemantics(AST.Node astExpr, Perspective perspective, ParserOptions parserOptions, IEnumerable <DbParameterReferenceExpression> parameters) { ParseResult result = AnalyzeSemanticsCommon(astExpr, perspective, parserOptions, parameters, null /*variables*/, (analyzer, astExpression) => { var parseResultInternal = analyzer.AnalyzeCommand(astExpression); Debug.Assert(parseResultInternal != null, "parseResultInternal != null post-condition FAILED"); Debug.Assert(parseResultInternal.CommandTree != null, "parseResultInternal.CommandTree != null post-condition FAILED"); return(parseResultInternal); }); return(result); }
/// <summary> /// Performs semantic conversion, validation on a query command AST and creates a <see cref="DbLambda"/> /// </summary> /// <param name="astQueryCommand">Abstract Syntax Tree of the query command</param> /// <param name="perspective">perspective</param> /// <param name="parserOptions">parser options<seealso cref="ParserOptions"/></param> /// <param name="parameters">ordinary command parameters</param> /// <param name="variables">command free variables</param> /// <remarks>Parameters name/types must be bound before invoking this method</remarks> /// <exception cref="System.Data.EntityException">Thrown when Syntatic or Semantic rules are violated and the query cannot be accepted.</exception> /// <exception cref="System.Data.MetadataException">Thrown as inner exception of a EntityException when metadata related service requests fail.</exception> /// <exception cref="System.Data.MappingException">Thrown as inner exception of a EntityException when mapping related service requests fail.</exception> /// <remarks> /// This method is not thread safe. /// </remarks> /// <seealso cref="ParserOptions"/> /// <seealso cref="DbExpression"/> private static DbLambda AnalyzeQueryExpressionSemantics(AST.Node astQueryCommand, Perspective perspective, ParserOptions parserOptions, IEnumerable <DbParameterReferenceExpression> parameters, IEnumerable <DbVariableReferenceExpression> variables) { return(AnalyzeSemanticsCommon( astQueryCommand, perspective, parserOptions, parameters, variables, (analyzer, astExpr) => { DbLambda lambda = analyzer.AnalyzeQueryCommand(astExpr); Debug.Assert(null != lambda, "null != lambda post-condition FAILED"); return lambda; })); }
private static TResult AnalyzeSemanticsCommon <TResult>(AST.Node astExpr, Perspective perspective, ParserOptions parserOptions, IEnumerable <DbParameterReferenceExpression> parameters, IEnumerable <DbVariableReferenceExpression> variables, Func <SemanticAnalyzer, AST.Node, TResult> analysisFunction) where TResult : class { TResult result = null; try { // // Validate arguments // EntityUtil.CheckArgumentNull(astExpr, "astExpr"); EntityUtil.CheckArgumentNull(perspective, "perspective"); // // Invoke semantic analysis // SemanticAnalyzer analyzer = (new SemanticAnalyzer(SemanticResolver.Create(perspective, parserOptions, parameters, variables))); result = analysisFunction(analyzer, astExpr); } // // Wrap MetadataException as EntityException inner exception // catch (System.Data.MetadataException metadataException) { throw EntityUtil.EntitySqlError(System.Data.Entity.Strings.GeneralExceptionAsQueryInnerException("Metadata"), metadataException); } // // Wrap MappingException as EntityException inner exception // catch (System.Data.MappingException mappingException) { throw EntityUtil.EntitySqlError(System.Data.Entity.Strings.GeneralExceptionAsQueryInnerException("Mapping"), mappingException); } return(result); }
internal Token(short tokenId, AST.Node tokenValue) { _tokenId = tokenId; _tokenValue = tokenValue; }
/// <summary> /// Creates a new token. /// </summary> /// <param name="tokenId">tokenid</param> /// <param name="tokenvalue">ast node</param> /// <returns></returns> static internal Token NewToken(short tokenId, AST.Node tokenvalue) { return(new Token(tokenId, tokenvalue)); }