Example #1
0
        private static bool TryTakeDateTime(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token)
        {
            if (stringKeeper.IsNext("datetime'"))
            {
                var work = stringKeeper.Take(8);
                Debug.Assert(work.Next == '\'');

                StringKeeper literalEnd;
                Token        literalToken;
                TryTakeStringLiteral(work, out literalEnd, out literalToken);
                newStringKeeper = literalEnd;

                if (literalToken.TokenType == TokenType.Error)
                {
                    token = new Token(TokenType.Error, literalEnd.Difference(stringKeeper));
                    return(true);
                }

                literalToken.TokenType = TokenType.DateTimeLiteral;
                token = literalToken;
                return(true);
            }

            newStringKeeper = stringKeeper;
            token           = null;
            return(false);
        }
Example #2
0
        private static bool TryTakeStringLiteral(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token)
        {
            if (stringKeeper.Next == '\'')
            {
                var start = stringKeeper.Take();
                var work  = new StringKeeper(start);
                while (!work.IsEmpty)
                {
                    if (work.IsNext("\'\'"))
                    {
                        work = work.Take(2);
                    }
                    else
                    {
                        if (work.Next == '\'')
                        {
                            var literalValue = work.Difference(start).Replace("''", "'");

                            token           = new Token(TokenType.StringLiteral, literalValue);
                            work            = work.Take();
                            newStringKeeper = work;

                            if (!IsTerminator(work))
                            {
                                do
                                {
                                    work = work.Take();
                                } while (!work.IsEmpty && !work.IsWhitespace);

                                token.TokenType = TokenType.Error;
                                return(true);
                            }

                            return(true);
                        }
                        else
                        {
                            work = work.Take();
                        }
                    }
                }

                newStringKeeper = work;
                token           = new Token(TokenType.Error, work.Difference(stringKeeper));
                return(true);
            }

            newStringKeeper = stringKeeper;
            token           = null;
            return(false);
        }
Example #3
0
        private static bool TryTakeParens(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token)
        {
            var thisParens = _parens.FirstOrDefault(x => stringKeeper.IsNext(x.Key));

            if (thisParens.Key != null)
            {
                var work = stringKeeper.Take(thisParens.Key.Length);
                newStringKeeper = work;
                token           = thisParens.Value;
                return(true);
            }

            newStringKeeper = stringKeeper;
            token           = null;
            return(false);
        }
Example #4
0
        private static bool TryTakeOperator(StringKeeper stringKeeper, out StringKeeper newStringKeeper, out Token token)
        {
            var thisOp = _operators.FirstOrDefault(x => stringKeeper.IsNext(x.Key));

            if (thisOp.Key != null)
            {
                var work = stringKeeper.Take(thisOp.Key.Length);
                if (work.IsEmpty || work.IsWhitespace || work.IsNext("("))
                {
                    newStringKeeper = work;
                    token           = thisOp.Value;
                    return(true);
                }
            }
            newStringKeeper = stringKeeper;
            token           = null;
            return(false);
        }