//public bool Read<T>(out T token)
            //{
            //    var baseRead = Read(out token);
            //    if (!(token is T))
            //        throw new Exception("Expected " + typeof(T));

            //    return baseRead;
            //}

            public bool Read(out BooleanExpressionToken token)
            {
                Position++;

                if (IsEof)
                {
                    token = null;
                    return(false);
                }

                token = Tokens[Position];
                return(true);
            }
        private ScalarValueExpression ReadScalar(BooleanExpressionToken token)
        {
            if (token is VariableReference _variable)
            {
                return new IdentifierExpression {
                           Name = _variable.Name
                }
            }
            ;

            if (token is DecimalLiteral @decimal)
            {
                return new LiteralDecimalExpression {
                           Value = @decimal.Value
                }
            }
            ;

            if (token is StringLiteral @string)
            {
                return new LiteralStringExpression {
                           Value = @string.Value
                }
            }
            ;

            if (token is IntegerLiteral @int)
            {
                return new LiteralIntExpression {
                           Value = @int.Value
                }
            }
            ;

            if (token is GuidLiteral @guid)
            {
                return new LiteralGuidExpression {
                           Value = @guid.Value
                }
            }
            ;

            throw new ArgumentException("Invalid scalar expression.");
        }