/// <summary>
		/// 
		/// </summary>
		/// <param name="token"></param>
		/// <param name="q"></param>
		public void Token( string token, QueryTranslator q )
		{
			string lcToken = token.ToLower( System.Globalization.CultureInfo.InvariantCulture );

			//Cope with [,]

			if( token.Equals( "[" ) && !expectingPathContinuation )
			{
				expectingPathContinuation = false;
				if( expectingIndex == 0 )
				{
					throw new QueryException( "unexpected [" );
				}
				return;
			}
			else if( token.Equals( "]" ) )
			{
				expectingIndex--;
				expectingPathContinuation = true;
				return;
			}

			//Cope with a continued path expression (ie. ].baz)
			if( expectingPathContinuation )
			{
				if ( ContinuePathExpression( token, q ) ) return;
			}

			//Cope with a subselect
			if( !inSubselect && ( lcToken.Equals( "select" ) || lcToken.Equals( "from" ) ) )
			{
				inSubselect = true;
				subselect = new StringBuilder( 20 );
			}
			if( inSubselect && token.Equals( StringHelper.ClosedParen ) )
			{
				bracketsSinceSelect--;

				if( bracketsSinceSelect == -1 )
				{
					QueryTranslator subq = new QueryTranslator( subselect.ToString() );
					try
					{
						subq.Compile( q );
					}
					catch( MappingException me )
					{
						throw new QueryException( "MappingException occurred compiling subquery", me );
					}

					AppendToken( q, subq.SqlString );
					inSubselect = false;
					bracketsSinceSelect = 0;
				}
			}
			if( inSubselect )
			{
				if( token.Equals( StringHelper.OpenParen ) )
				{
					bracketsSinceSelect++;
				}
				subselect.Append( token ).Append( ' ' );
				return;
			}

			//Cope with special cases of AND, NOT, ()
			SpecialCasesBefore( lcToken );

			//Close extra brackets we opened
			if( !betweenSpecialCase && expressionTerminators.Contains( lcToken ) )
			{
				CloseExpression( q, lcToken );
			}

			//take note when this is a boolean expression

			if( booleanOperators.Contains( lcToken ) )
			{
				booleanTests.RemoveAt( booleanTests.Count - 1 );
				booleanTests.Add( true );
			}

			if( lcToken.Equals( "not" ) )
			{
				nots[ nots.Count - 1 ] = !( ( bool ) nots[ nots.Count - 1 ] );
				negated = !negated;
				return; //NOTE: early return
			}

			//process a token, mapping OO path expressions to SQL expressions
			DoToken( token, q );

			//Open any extra brackets we might need.

			if( !betweenSpecialCase && expressionOpeners.Contains( lcToken ) )
			{
				OpenExpression( q, lcToken );
			}

			//Cope with special cases of AND, NOT, )
			SpecialCasesAfter( lcToken );
		}