Code:
/ 4.0 / 4.0 / untmp / 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 NodeList ToNodeList(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
- FilterInvalidBodyAccessException.cs
- StateMachineSubscription.cs
- Literal.cs
- KeyEvent.cs
- KnownTypeHelper.cs
- DtrList.cs
- SectionVisual.cs
- MultiView.cs
- Point3DAnimationBase.cs
- DataControlPagerLinkButton.cs
- DispatcherOperation.cs
- ErrorTableItemStyle.cs
- WindowsListBox.cs
- Invariant.cs
- UpdatePanel.cs
- PrintDialog.cs
- SpotLight.cs
- BamlMapTable.cs
- CompositionAdorner.cs
- ClientOptions.cs
- QuadTree.cs
- HashAlgorithm.cs
- Visual3D.cs
- RemotingException.cs
- TypeNameHelper.cs
- WebContentFormatHelper.cs
- MetadataPropertyAttribute.cs
- OraclePermission.cs
- Point3DConverter.cs
- DataGridViewComboBoxEditingControl.cs
- ToolBarPanel.cs
- COM2ColorConverter.cs
- IsolatedStorage.cs
- LineBreakRecord.cs
- GroupDescription.cs
- UniqueEventHelper.cs
- ColorAnimation.cs
- HandlerMappingMemo.cs
- Validator.cs
- TextBoxAutomationPeer.cs
- PermissionSetTriple.cs
- QueryUtil.cs
- BrushValueSerializer.cs
- TemplateEditingService.cs
- Rfc2898DeriveBytes.cs
- Freezable.cs
- ListViewCancelEventArgs.cs
- NameObjectCollectionBase.cs
- ButtonBase.cs
- FindCriteria11.cs
- UpdateManifestForBrowserApplication.cs
- WebUtil.cs
- PixelShader.cs
- BinHexDecoder.cs
- GenericsNotImplementedException.cs
- ConnectionManagementSection.cs
- XsltSettings.cs
- EntityDataSourceQueryBuilder.cs
- JoinTreeNode.cs
- GenericWebPart.cs
- TripleDESCryptoServiceProvider.cs
- InstallerTypeAttribute.cs
- RegexCompilationInfo.cs
- FlowPosition.cs
- CapabilitiesPattern.cs
- FrameworkElementFactoryMarkupObject.cs
- SectionInput.cs
- KnownTypesProvider.cs
- TemplateManager.cs
- DataPointer.cs
- DataPagerFieldCollection.cs
- SoapHeaders.cs
- ImageMapEventArgs.cs
- DataGridHyperlinkColumn.cs
- StreamHelper.cs
- InputQueueChannel.cs
- RawMouseInputReport.cs
- ReachPageContentCollectionSerializer.cs
- GradientBrush.cs
- SrgsRuleRef.cs
- TCEAdapterGenerator.cs
- CompilerGlobalScopeAttribute.cs
- StrokeNodeData.cs
- SecurityResources.cs
- ImageBrush.cs
- ListItemCollection.cs
- _Semaphore.cs
- KeyPressEvent.cs
- DynamicValueConverter.cs
- SpeechRecognizer.cs
- HybridObjectCache.cs
- RoleServiceManager.cs
- DeviceFilterDictionary.cs
- ReflectionUtil.cs
- PropertyRef.cs
- PropertyGridEditorPart.cs
- ImageListStreamer.cs
- ReaderOutput.cs
- SqlStream.cs
- PrivilegeNotHeldException.cs