Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Common / EntitySql / CqlParserHelpers.cs / 4 / CqlParserHelpers.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Common.EntitySql
{
using System;
using System.IO;
using System.Globalization;
///
/// Represents the Cql Parser engine. Also, implements helpers and util routines.
///
internal sealed partial class CqlParser
{
private Expr _parsedTree;
private CqlLexer _lexer;
private string _query;
private ParserOptions _parserOptions = new ParserOptions();
private const string _internalYaccSyntaxErrorMessage = "syntax error";
private uint _methodCallNodeCount;
private string _version = YYMAJOR.ToString(NumberFormatInfo.InvariantInfo) + '.' + YYMINOR.ToString(NumberFormatInfo.InvariantInfo);
internal CqlParser( ParserOptions parserOptions, bool debug )
{
_parserOptions = parserOptions;
yydebug = debug;
}
///
/// Main entry point for parsing cql.
///
/// cql query string
/// Thrown when Syntatic rules are violated and the query cannot be accepted
/// Abstract Syntax Tree
internal Expr Parse( string query )
{
_query = query;
_parsedTree = null;
_methodCallNodeCount = 0;
_parserOptions = _parserOptions.MakeReadOnly();
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 AstNode AstNode( object o ) { return ((AstNode)o); }
private static int AstNodePos( object o ) { return ((AstNode)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 ExprList ToExprList( object o ) { return ((ExprList)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;
AstNode astNode = yylval as AstNode;
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( AstNode astExpr, CqlLexer.TerminalToken tokenValue, string info )
{
SetErrCtx(astExpr, tokenValue.IPos, info);
}
private void SetErrCtx( AstNode astExpr, int inputPos, string info )
{
astExpr.ErrCtx.InputPosition = inputPos;
astExpr.ErrCtx.ErrorContextInfo = info;
astExpr.ErrCtx.QueryText = _query;
}
private void ResetMethodCallCount()
{
_methodCallNodeCount = 0;
}
private void IncrementMethodCallCount()
{
unchecked { _methodCallNodeCount++; }
}
private uint MethodCallCount
{
get { return _methodCallNodeCount; }
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Common.EntitySql
{
using System;
using System.IO;
using System.Globalization;
///
/// Represents the Cql Parser engine. Also, implements helpers and util routines.
///
internal sealed partial class CqlParser
{
private Expr _parsedTree;
private CqlLexer _lexer;
private string _query;
private ParserOptions _parserOptions = new ParserOptions();
private const string _internalYaccSyntaxErrorMessage = "syntax error";
private uint _methodCallNodeCount;
private string _version = YYMAJOR.ToString(NumberFormatInfo.InvariantInfo) + '.' + YYMINOR.ToString(NumberFormatInfo.InvariantInfo);
internal CqlParser( ParserOptions parserOptions, bool debug )
{
_parserOptions = parserOptions;
yydebug = debug;
}
///
/// Main entry point for parsing cql.
///
/// cql query string
/// Thrown when Syntatic rules are violated and the query cannot be accepted
/// Abstract Syntax Tree
internal Expr Parse( string query )
{
_query = query;
_parsedTree = null;
_methodCallNodeCount = 0;
_parserOptions = _parserOptions.MakeReadOnly();
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 AstNode AstNode( object o ) { return ((AstNode)o); }
private static int AstNodePos( object o ) { return ((AstNode)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 ExprList ToExprList( object o ) { return ((ExprList)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;
AstNode astNode = yylval as AstNode;
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( AstNode astExpr, CqlLexer.TerminalToken tokenValue, string info )
{
SetErrCtx(astExpr, tokenValue.IPos, info);
}
private void SetErrCtx( AstNode astExpr, int inputPos, string info )
{
astExpr.ErrCtx.InputPosition = inputPos;
astExpr.ErrCtx.ErrorContextInfo = info;
astExpr.ErrCtx.QueryText = _query;
}
private void ResetMethodCallCount()
{
_methodCallNodeCount = 0;
}
private void IncrementMethodCallCount()
{
unchecked { _methodCallNodeCount++; }
}
private uint MethodCallCount
{
get { return _methodCallNodeCount; }
}
}
}
// 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
- SessionStateModule.cs
- XsdBuildProvider.cs
- ThousandthOfEmRealPoints.cs
- DiscoveryServerProtocol.cs
- WebGetAttribute.cs
- StorageComplexTypeMapping.cs
- ComponentDispatcherThread.cs
- ScalarConstant.cs
- BitmapEffectGroup.cs
- ParameterToken.cs
- KeyedHashAlgorithm.cs
- DataGridColumnReorderingEventArgs.cs
- CqlLexer.cs
- AttachInfo.cs
- UseLicense.cs
- ThousandthOfEmRealDoubles.cs
- EdmProviderManifest.cs
- basecomparevalidator.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- MenuAutomationPeer.cs
- EntityDataSourceDataSelection.cs
- Executor.cs
- ResourceDictionaryCollection.cs
- HScrollProperties.cs
- ModelTreeManager.cs
- SrgsDocumentParser.cs
- Expander.cs
- CompilerState.cs
- x509utils.cs
- PrintPageEvent.cs
- NullReferenceException.cs
- PeerNameRegistration.cs
- CachedPathData.cs
- Pool.cs
- TextTrailingCharacterEllipsis.cs
- DataGridViewColumnCollectionEditor.cs
- HybridObjectCache.cs
- GridViewEditEventArgs.cs
- CompiledQuery.cs
- JournalNavigationScope.cs
- RemoteWebConfigurationHostStream.cs
- ForEachAction.cs
- ClientSettingsStore.cs
- NavigateEvent.cs
- AutomationAttributeInfo.cs
- Journaling.cs
- X509ChainPolicy.cs
- Calendar.cs
- RTTrackingProfile.cs
- SecurityContext.cs
- BitmapEffectGroup.cs
- HttpListener.cs
- ComNativeDescriptor.cs
- Utils.cs
- formatter.cs
- DataGridPagerStyle.cs
- LinearGradientBrush.cs
- metrodevice.cs
- ExecutionScope.cs
- SrgsSubset.cs
- WsdlImporterElementCollection.cs
- WebPartTracker.cs
- XmlBufferedByteStreamReader.cs
- Error.cs
- StyleXamlParser.cs
- DockEditor.cs
- HttpResponseWrapper.cs
- SecurityException.cs
- ReadingWritingEntityEventArgs.cs
- CustomValidator.cs
- _AcceptOverlappedAsyncResult.cs
- TextServicesCompartment.cs
- TextBoxView.cs
- ProxyFragment.cs
- panel.cs
- FixedFlowMap.cs
- StorageBasedPackageProperties.cs
- FontStyles.cs
- ETagAttribute.cs
- RoutedPropertyChangedEventArgs.cs
- PersistenceProvider.cs
- FlowDocumentView.cs
- CharacterString.cs
- DataGridColumnHeaderAutomationPeer.cs
- DateTimeConverter2.cs
- TableLayoutColumnStyleCollection.cs
- HeaderUtility.cs
- NativeRecognizer.cs
- LogSwitch.cs
- StaticTextPointer.cs
- ConfigWriter.cs
- ItemCollection.cs
- GeometryDrawing.cs
- OdbcEnvironment.cs
- ZipIOCentralDirectoryFileHeader.cs
- ProcessHost.cs
- ThreadStartException.cs
- RichListBox.cs
- ProcessInputEventArgs.cs
- InstanceOwner.cs