// return null if this token isn't for this expression parser
        public IExpression Parse(IParser parser, IStream <IToken> tokenStream, ref IParseError parseError)
        {
            IExpression    declareExpression = null;
            IList <IToken> tokens            = new List <IToken>();
            IToken         token             = tokenStream.Get(); // the first is the keyword

            if ((token.Kind == TokenKind.UnquotedWord) && (token.Info == keywords.comment))
            {
                while ((token.Kind != TokenKind.NULL) && (!((token.Kind == TokenKind.UnquotedWord) && (token.Info == keywords.end))))
                {
                    tokens.Add(token);
                    token = tokenStream.Get();
                }
                tokens.Add(token);
                declareExpression = DeclareExpression.Create(parser, tokens, ref parseError);
            }
            else
            {
                tokenStream.Push(token);
            }
            return(declareExpression);
        }
        public DeclareExpression Build()
        {
            var expression = new DeclareExpression(_block);

            var node = new DeclareOperator(_block);

            while (_reader.HasNext())
            {
                _reader.Next();

                var token = _reader.Current();

                /*
                 *  In this loop,tokens type  can only be ',', 'identifer',';','='
                 *  ',',';','=', requires previous token must be an  Identifier
                 *
                 */

                if (token.TokenType == TokenType.Identifier)
                {
                    node.Operands.Add(new OperandNode(new JString(token.Value)));
                }
                else if (token.OperatorType == OperatorType.Coma)//mutiple  variable declaration
                {
                    requirePreviousIsIdentifier();

                    continue;
                }
                else if (token.OperatorType == OperatorType.ExpressionEnd)//declaration ends
                {
                    requirePreviousIsIdentifier();

                    node.DoCheck();

                    expression.Root = node;

                    return(expression);
                }
                else if (token.OperatorType == OperatorType.Assignment)// this expression is a  declare-assignment expression
                {
                    requirePreviousIsIdentifier();

                    var assign = new DeclareAsignmentNode(_block);

                    var astNode = new AstNodeBuilder(_reader, _block, _intercptChars).Build();

                    node.DoCheck();

                    assign.Operands = node.Operands;

                    assign.Operands.Add(astNode);

                    expression.Root = assign;

                    return(expression);
                }
                else
                {
                    //invalid token type
                    throwError("");
                }
            }
            // expression incomplete
            throwError("");

            return(null);
        }