Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Common / EntitySql / CqlParserHelpers.cs / 1305376 / CqlParserHelpers.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- namespace System.Data.Common.EntitySql { using System; using System.Collections.Generic; using System.IO; using System.Globalization; using System.Data.Common.EntitySql.AST; ////// Represents the Cql Parser engine. Also, implements helpers and util routines. /// internal sealed partial class CqlParser { private Node _parsedTree; private CqlLexer _lexer; private string _query; private ParserOptions _parserOptions; private const string _internalYaccSyntaxErrorMessage = "syntax error"; ////// Contains inclusive count of method expressions. /// private uint _methodExprCounter; private Stack_methodExprCounterStack; private string _version = YYMAJOR.ToString(NumberFormatInfo.InvariantInfo) + '.' + YYMINOR.ToString(NumberFormatInfo.InvariantInfo); internal CqlParser( ParserOptions parserOptions, bool debug ) { // The common practice is to make the null check at the public surface, // however this method is a convergence zone from multiple public entry points and it makes sense to // check for null once, here. EntityUtil.CheckArgumentNull(parserOptions, "parserOptions"); _parserOptions = parserOptions; yydebug = debug; } /// /// Main entry point for parsing cql. /// /// query text ///Thrown when Syntatic rules are violated and the query cannot be accepted ///Abstract Syntax Tree internal Node Parse(string query) { // The common practice is to make the null check at the public surface, // however this method is a convergence zone from multiple public entry points and it makes sense to // check for null once, here. EntityUtil.CheckArgumentNull(query, "query"); if (String.IsNullOrEmpty(query) || query.Trim().Length == 0) { throw EntityUtil.Argument(System.Data.Entity.Strings.InvalidEmptyQueryTextArgument); } _query = query; _parsedTree = null; _parserOptions = _parserOptions.MakeReadOnly(); _methodExprCounter = 0; _methodExprCounterStack = new Stack(); internalParseEntryPoint(); return _parsedTree; } /// /// Returns query string /// internal string Query { get { return _query; } } #if EXTRA_ENTITYSQL_PARSER_DEBUGGING ////// Enables/Disables yacc debugging. /// internal bool EnableDebug { get { return yydebug; } set { yydebug = value; } } #endif ////// Returns ParserOptions used /// ///Once parse has been invoked, ParserOptions are frozen and cannot be changed. otherwise a EntityException exception will be thrown internal ParserOptions ParserOptions { get { return _parserOptions; } } ////// Internal entry point /// private void internalParseEntryPoint() { _lexer = new CqlLexer(Query, ParserOptions); #if EXTRA_ENTITYSQL_PARSER_DEBUGGING CqlLexer.Token tk = lexer.yylex(); while (null != tk) { Console.WriteLine("{0} := {1}", tk.TokenId, lexer.yytext()); tk = lexer.yylex(); } #endif yyparse(); } // // Conversion/Cast/Helpers // private static Node AstNode(object o) { return ((Node)o); } private static int AstNodePos( object o ) { return ((Node)o).ErrCtx.InputPosition; } private static CqlLexer.TerminalToken Terminal( object o ) { return ((CqlLexer.TerminalToken)o); } private static int TerminalPos( object o ) { return ((CqlLexer.TerminalToken)o).IPos; } private static NodeListToNodeList (object o) where T : Node { return ((NodeList )o); } private short yylex() { CqlLexer.Token token = null; token = _lexer.yylex(); if (null == token) { return 0; } _lexer.AdvanceIPos(); yylval = token.Value; return token.TokenId; } private void yyerror_stackoverflow() { yyerror(System.Data.Entity.Strings.StackOverflowInParser); } private void yyerror( string s ) { if (s.Equals(_internalYaccSyntaxErrorMessage, StringComparison.Ordinal)) { int errorPosition = _lexer.IPos; string syntaxContextInfo = null; string term = _lexer.YYText; if (!String.IsNullOrEmpty(term)) { syntaxContextInfo = System.Data.Entity.Strings.LocalizedTerm; ErrorContext errCtx = null; Node astNode = yylval as Node; if (null != astNode && (null != astNode.ErrCtx) && (!String.IsNullOrEmpty(astNode.ErrCtx.ErrorContextInfo))) { errCtx = astNode.ErrCtx; errorPosition = Math.Min(errorPosition, errorPosition - term.Length); } if ((yylval is CqlLexer.TerminalToken) && CqlLexer.IsReservedKeyword(term) && !(astNode is Identifier)) { syntaxContextInfo = System.Data.Entity.Strings.LocalizedKeyword; term = term.ToUpperInvariant(); errorPosition = Math.Min(errorPosition, errorPosition - term.Length); } else if (null != errCtx) { syntaxContextInfo = EntityRes.GetString(errCtx.ErrorContextInfo); } syntaxContextInfo = String.Format(CultureInfo.CurrentCulture, "{0} '{1}'", syntaxContextInfo, term); } throw EntityUtil.EntitySqlError(_query, System.Data.Entity.Strings.GenericSyntaxError, errorPosition, syntaxContextInfo, false /* loadErrorContextInfoFromResource */); } throw EntityUtil.EntitySqlError(_query, s, _lexer.IPos); } // // Error tracking helpers // private void SetErrCtx(Node astExpr, CqlLexer.TerminalToken tokenValue, string info) { SetErrCtx(astExpr, tokenValue.IPos, info); } private void SetErrCtx(Node astExpr, int inputPos, string info) { astExpr.ErrCtx.InputPosition = inputPos; astExpr.ErrCtx.ErrorContextInfo = info; astExpr.ErrCtx.CommandText = _query; } private void StartMethodExprCounting() { // Save the current counter value. _methodExprCounterStack.Push(_methodExprCounter); // Reset the counter for the current level. _methodExprCounter = 0; } private void IncrementMethodExprCount() { ++_methodExprCounter; } private uint EndMethodExprCounting() { // Save number of method expressions on the current level. uint count = _methodExprCounter; // Restore upper level counter and adjust it with the number of method expressions on the current level. _methodExprCounter += _methodExprCounterStack.Pop(); return count; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- namespace System.Data.Common.EntitySql { using System; using System.Collections.Generic; using System.IO; using System.Globalization; using System.Data.Common.EntitySql.AST; ////// Represents the Cql Parser engine. Also, implements helpers and util routines. /// internal sealed partial class CqlParser { private Node _parsedTree; private CqlLexer _lexer; private string _query; private ParserOptions _parserOptions; private const string _internalYaccSyntaxErrorMessage = "syntax error"; ////// Contains inclusive count of method expressions. /// private uint _methodExprCounter; private Stack_methodExprCounterStack; private string _version = YYMAJOR.ToString(NumberFormatInfo.InvariantInfo) + '.' + YYMINOR.ToString(NumberFormatInfo.InvariantInfo); internal CqlParser( ParserOptions parserOptions, bool debug ) { // The common practice is to make the null check at the public surface, // however this method is a convergence zone from multiple public entry points and it makes sense to // check for null once, here. EntityUtil.CheckArgumentNull(parserOptions, "parserOptions"); _parserOptions = parserOptions; yydebug = debug; } /// /// Main entry point for parsing cql. /// /// query text ///Thrown when Syntatic rules are violated and the query cannot be accepted ///Abstract Syntax Tree internal Node Parse(string query) { // The common practice is to make the null check at the public surface, // however this method is a convergence zone from multiple public entry points and it makes sense to // check for null once, here. EntityUtil.CheckArgumentNull(query, "query"); if (String.IsNullOrEmpty(query) || query.Trim().Length == 0) { throw EntityUtil.Argument(System.Data.Entity.Strings.InvalidEmptyQueryTextArgument); } _query = query; _parsedTree = null; _parserOptions = _parserOptions.MakeReadOnly(); _methodExprCounter = 0; _methodExprCounterStack = new Stack(); internalParseEntryPoint(); return _parsedTree; } /// /// Returns query string /// internal string Query { get { return _query; } } #if EXTRA_ENTITYSQL_PARSER_DEBUGGING ////// Enables/Disables yacc debugging. /// internal bool EnableDebug { get { return yydebug; } set { yydebug = value; } } #endif ////// Returns ParserOptions used /// ///Once parse has been invoked, ParserOptions are frozen and cannot be changed. otherwise a EntityException exception will be thrown internal ParserOptions ParserOptions { get { return _parserOptions; } } ////// Internal entry point /// private void internalParseEntryPoint() { _lexer = new CqlLexer(Query, ParserOptions); #if EXTRA_ENTITYSQL_PARSER_DEBUGGING CqlLexer.Token tk = lexer.yylex(); while (null != tk) { Console.WriteLine("{0} := {1}", tk.TokenId, lexer.yytext()); tk = lexer.yylex(); } #endif yyparse(); } // // Conversion/Cast/Helpers // private static Node AstNode(object o) { return ((Node)o); } private static int AstNodePos( object o ) { return ((Node)o).ErrCtx.InputPosition; } private static CqlLexer.TerminalToken Terminal( object o ) { return ((CqlLexer.TerminalToken)o); } private static int TerminalPos( object o ) { return ((CqlLexer.TerminalToken)o).IPos; } private static NodeListToNodeList (object o) where T : Node { return ((NodeList )o); } private short yylex() { CqlLexer.Token token = null; token = _lexer.yylex(); if (null == token) { return 0; } _lexer.AdvanceIPos(); yylval = token.Value; return token.TokenId; } private void yyerror_stackoverflow() { yyerror(System.Data.Entity.Strings.StackOverflowInParser); } private void yyerror( string s ) { if (s.Equals(_internalYaccSyntaxErrorMessage, StringComparison.Ordinal)) { int errorPosition = _lexer.IPos; string syntaxContextInfo = null; string term = _lexer.YYText; if (!String.IsNullOrEmpty(term)) { syntaxContextInfo = System.Data.Entity.Strings.LocalizedTerm; ErrorContext errCtx = null; Node astNode = yylval as Node; if (null != astNode && (null != astNode.ErrCtx) && (!String.IsNullOrEmpty(astNode.ErrCtx.ErrorContextInfo))) { errCtx = astNode.ErrCtx; errorPosition = Math.Min(errorPosition, errorPosition - term.Length); } if ((yylval is CqlLexer.TerminalToken) && CqlLexer.IsReservedKeyword(term) && !(astNode is Identifier)) { syntaxContextInfo = System.Data.Entity.Strings.LocalizedKeyword; term = term.ToUpperInvariant(); errorPosition = Math.Min(errorPosition, errorPosition - term.Length); } else if (null != errCtx) { syntaxContextInfo = EntityRes.GetString(errCtx.ErrorContextInfo); } syntaxContextInfo = String.Format(CultureInfo.CurrentCulture, "{0} '{1}'", syntaxContextInfo, term); } throw EntityUtil.EntitySqlError(_query, System.Data.Entity.Strings.GenericSyntaxError, errorPosition, syntaxContextInfo, false /* loadErrorContextInfoFromResource */); } throw EntityUtil.EntitySqlError(_query, s, _lexer.IPos); } // // Error tracking helpers // private void SetErrCtx(Node astExpr, CqlLexer.TerminalToken tokenValue, string info) { SetErrCtx(astExpr, tokenValue.IPos, info); } private void SetErrCtx(Node astExpr, int inputPos, string info) { astExpr.ErrCtx.InputPosition = inputPos; astExpr.ErrCtx.ErrorContextInfo = info; astExpr.ErrCtx.CommandText = _query; } private void StartMethodExprCounting() { // Save the current counter value. _methodExprCounterStack.Push(_methodExprCounter); // Reset the counter for the current level. _methodExprCounter = 0; } private void IncrementMethodExprCount() { ++_methodExprCounter; } private uint EndMethodExprCounting() { // Save number of method expressions on the current level. uint count = _methodExprCounter; // Restore upper level counter and adjust it with the number of method expressions on the current level. _methodExprCounter += _methodExprCounterStack.Pop(); return count; } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Stroke.cs
- AttachedPropertyDescriptor.cs
- EventToken.cs
- XmlObjectSerializerReadContextComplexJson.cs
- AncillaryOps.cs
- BStrWrapper.cs
- TemplateFactory.cs
- XsdDuration.cs
- Int32Storage.cs
- basecomparevalidator.cs
- ContainerUIElement3D.cs
- DrawingState.cs
- WindowInteractionStateTracker.cs
- RequestCacheManager.cs
- Menu.cs
- ACE.cs
- LoaderAllocator.cs
- precedingsibling.cs
- NativeActivityContext.cs
- WebPartManagerInternals.cs
- BindingGraph.cs
- FormatException.cs
- ImmutableObjectAttribute.cs
- BulletedList.cs
- WorkflowDebuggerSteppingAttribute.cs
- ReadOnlyDataSourceView.cs
- IntegerValidator.cs
- AnnotationComponentChooser.cs
- SystemIPInterfaceProperties.cs
- Predicate.cs
- ClientUtils.cs
- Funcletizer.cs
- ClientConfigPaths.cs
- EntityContainer.cs
- PerformanceCounterManager.cs
- Button.cs
- OleDbPermission.cs
- CngUIPolicy.cs
- BindingsCollection.cs
- Error.cs
- XmlSchemaDocumentation.cs
- regiisutil.cs
- _ChunkParse.cs
- MethodBuilder.cs
- AssemblyResourceLoader.cs
- DetailsViewModeEventArgs.cs
- DataServiceEntityAttribute.cs
- RoleProviderPrincipal.cs
- OleDbTransaction.cs
- BindingListCollectionView.cs
- Cursors.cs
- AssemblyResourceLoader.cs
- Int64Animation.cs
- OleCmdHelper.cs
- CachedPathData.cs
- _AcceptOverlappedAsyncResult.cs
- OdbcConnectionPoolProviderInfo.cs
- ClientConvert.cs
- HtmlInputCheckBox.cs
- IndentedTextWriter.cs
- HitTestParameters.cs
- InputReport.cs
- TextTreeRootNode.cs
- CompilerCollection.cs
- BitmapVisualManager.cs
- OdbcErrorCollection.cs
- CheckBox.cs
- BindingCollection.cs
- SetterBaseCollection.cs
- TableCell.cs
- EntityDataSourceSelectedEventArgs.cs
- CompiledRegexRunnerFactory.cs
- InitialServerConnectionReader.cs
- ApplicationTrust.cs
- BlurEffect.cs
- WebPartZoneAutoFormat.cs
- VariantWrapper.cs
- FusionWrap.cs
- Scalars.cs
- TableAutomationPeer.cs
- MatrixConverter.cs
- ArrayExtension.cs
- IssuanceLicense.cs
- UrlAuthFailedErrorFormatter.cs
- NullableBoolConverter.cs
- ValidationVisibilityAttribute.cs
- NetworkInformationException.cs
- ObservableCollectionDefaultValueFactory.cs
- SqlDataSourceQueryEditor.cs
- SoapProtocolImporter.cs
- xmlsaver.cs
- SpellerHighlightLayer.cs
- EntityConnection.cs
- VerticalAlignConverter.cs
- XmlSchemaDatatype.cs
- RepeaterItem.cs
- TextBoxBase.cs
- RetrieveVirtualItemEventArgs.cs
- TextServicesCompartmentEventSink.cs
- TraceData.cs